如何解决shell:可变参数的默认值 ($@)
所以我正在编写一个带有可选参数的 shell 脚本(用 getopts
解析它们,什么不是;但这在这里并不重要)。
(脚本的)用户应该传递一些路径作为参数,然后由一些主力工具处理。
当然,路径可能包含空格,因此我使用双引号 ("$@"
) 以及许多其他标志传递参数:
像这样:
workhorse \
--verbose \
--stats \
--one-flag \
--another-flag \
"$@"
一切正常,但随后:
如果用户没有指定任何路径,我想回退到一些默认值。 我不知道如何实现这一点,同时仍然能够处理空格而不能。
天真的方法类似于:
if [ $# -gt 0 ]; then
workhorse \
--verbose \
--stats \
--one-flag \
--another-flag \
"$@"
else
workhorse \
--verbose \
--stats \
--one-flag \
--another-flag \
/home/foo /home/bar
fi
但这当然是非常丑陋的。
相反,我想使用变量替换,用默认值替换 $@
,如下所示:
default_paths="/home/foo /home/bar"
workhorse \
--verbose \
--stats \
--one-flag \
--another-flag \
${@:-${default_paths}}
只要通过 cmdline 传递的路径不包含任何空格($@
周围没有双引号),这就有效。
为了支持 args 中的空格,我将使用双引号,但 "${@:-${default_paths}"
将(同时正确扩展 cmdline-args)将 /home/foo /home/bar
字符串作为单个参数传递给我的主力。
我可以通过将标志放入 $flags
变量来简化上面的“丑陋”解决方案(只是不同地调用主力,取决于是否有任何 cmdline 提供的路径) - 但是如果这些标志本身可以包含(带有)空格的路径?
那么:有没有办法为可以包含空格的可变参数 shell 参数提供默认值?
类似于 shift
的倒数可能会有所帮助(您将新参数推送到位置参数队列)
我正在寻找符合 POSIX 标准的解决方案(而不是 bash 数组)。
解决方法
如果您可以控制如何在脚本中设置 default_paths
,那么您只需使用 set
将路径分配为位置参数
if [ $# -eq 0 ]; then
set -- "/home/foo" "/home/bar" "/home/path with spaces"
fi
并继续使用 "$@"
作为参数列表。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。