【发布时间】:2021-08-18 13:00:58
【问题描述】:
所以我正在编写一个带有可选参数的 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 数组)。
【问题讨论】:
标签: sh default-value variadic