bash - 当没有参数传递给脚本时,分配以.suite结尾的所有文件

时间:2012-07-14 15:29:34

标签: bash

我有一个脚本,您可以将测试套件作为参数传递给:

$ bash-specs a.suite b.suite

如果用户不提供任何测试套件,则应执行当前文件夹中的所有测试套件。这就是我目前的做法:

local suites

if (($# > 0)); then
  suites=$@
else
  suites=*.suite
fi

这是一个不错的解决方案,但我感觉有更优雅的方式。我基本上寻找一些方法来进行条件赋值或在没有给出参数的情况下设置默认值。

2 个答案:

答案 0 :(得分:5)

我会这样做:

if (( ! $# )); then
    set -- *.suite
fi

现在你有$ 1,$ 2等文件名,无论用户是指定还是默认。

一些注意事项:

您对suites的转让似乎没有任何有用的结果;它不是一个数组,所以你得到一个带有空格分隔文件名的字符串,或者未扩展的glob "*.suites"。我猜你以后会以某种方式结束eval,但这是一个坏主意 - 文件名中的任何空格或时髦字符都会搞砸。我建议循环遍历参数并单独处理它们,或使用实际数组。

如果您使用上面我的代码段,"$@"将扩展为所有参数,正确分隔,就像单独引用一样。如果您打算使用参数,可以将原始参数保存在数组变量中,如下所示:

suites=( "$@" )

然后用"${suites[@]}"检索整个事物(再次,正确分开)。

答案 1 :(得分:2)

注意:在使用此答案之前,请阅读评论,以讨论其缺点及其实际扩展方式。

短而甜蜜:

local suites=${@:-*.suite}

(双关的意思)

您可以在“参数扩展”下的${var:-default}手册页中详细了解bash语法。整个部分非常值得一读。

编辑:正如马克指出的那样,如果你的文件名中确实有空格,那么字符串值suites就不会非常有用(你将失去分隔符空间之间的区别,并且 - 名称空间)。我会回答他的问题。 (另外,我编辑了这个以删除引号,因为模式不会在引号内扩展。)

(我只是删除这个答案的一个编辑:)