2

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

$ bash-specs a.suite b.suite

如果用户没有提供任何测试套件,则当前文件夹中的所有测试套件都将被执行。这就是我目前这样做的方式:

local suites

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

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

4

2 回答 2

5

我会这样做:

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

现在,无论用户是指定它们还是让它们默认,您都有 $1、$2 等中的文件名。

一些注意事项:

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

如果您使用类似于我上面的代码片段的内容,"$@"它将扩展到所有参数,并正确分隔,就像单独引用一样。如果您要处理参数,可以将原始参数保存在数组变量中,如下所示:

suites=( "$@" )

然后用"${suites[@]}".

于 2012-07-14T16:00:58.743 回答
2

注意:在使用这个答案之前,请阅读评论以讨论它的缺点以及它是如何实际扩展的。

简短而甜蜜:

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

(双关语是有意的)

您可以在“参数扩展”下的手册页中阅读有关${var:-default}语法的更多信息。bash整个部分非常值得一读。

编辑:正如 Mark 指出的那样,如果文件名中确实有空格,那么字符串值suites将不是很有用(您将失去分隔符空格和名称空间之间的区别)。我会同意他的回答。(此外,我已对其进行了编辑以删除引号,因为该模式不会在引号内扩展。)

(我距离删除这个答案只有一个编辑:)

于 2012-07-14T15:43:28.193 回答