【问题标题】:shell: default values for varargs ($@)shell: 可变参数的默认值 ($@)
【发布时间】: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


    【解决方案1】:

    如果您可以控制如何在脚本中设置 default_paths,那么您可以使用 set 将路径分配为位置参数

    if [ $# -eq 0 ]; then
      set -- "/home/foo" "/home/bar" "/home/path with spaces"
    fi
    

    并继续使用"$@" 作为参数列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 2016-03-12
      相关资源
      最近更新 更多