我有一个脚本,您可以将测试套件作为参数传递给:
$ bash-specs a.suite b.suite
如果用户没有提供任何测试套件,则当前文件夹中的所有测试套件都将被执行。这就是我目前这样做的方式:
local suites
if (($# > 0)); then
suites=$@
else
suites=*.suite
fi
这是一个不错的解决方案,但我觉得有一种更优雅的方式。如果没有给出参数,我基本上会寻找一些方法来进行条件赋值或设置默认值。
我有一个脚本,您可以将测试套件作为参数传递给:
$ bash-specs a.suite b.suite
如果用户没有提供任何测试套件,则当前文件夹中的所有测试套件都将被执行。这就是我目前这样做的方式:
local suites
if (($# > 0)); then
suites=$@
else
suites=*.suite
fi
这是一个不错的解决方案,但我觉得有一种更优雅的方式。如果没有给出参数,我基本上会寻找一些方法来进行条件赋值或设置默认值。
我会这样做:
if (( ! $# )); then
set -- *.suite
fi
现在,无论用户是指定它们还是让它们默认,您都有 $1、$2 等中的文件名。
一些注意事项:
您的分配suites
似乎没有任何有用的结果;它不是一个数组,所以你要么得到一个带有空格分隔文件名的字符串,要么得到未扩展的 glob "*.suites"
。我猜你eval
稍后会以某种方式结束,但这是一个坏主意 - 文件名中的任何空格或时髦字符都会搞砸。我建议遍历参数并单独处理它们,或者使用实际的数组。
如果您使用类似于我上面的代码片段的内容,"$@"
它将扩展到所有参数,并正确分隔,就像单独引用一样。如果您要处理参数,可以将原始参数保存在数组变量中,如下所示:
suites=( "$@" )
然后用"${suites[@]}"
.
注意:在使用这个答案之前,请阅读评论以讨论它的缺点以及它是如何实际扩展的。
简短而甜蜜:
local suites=${@:-*.suite}
(双关语是有意的)
您可以在“参数扩展”下的手册页中阅读有关${var:-default}
语法的更多信息。bash
整个部分非常值得一读。
编辑:正如 Mark 指出的那样,如果文件名中确实有空格,那么字符串值suites
将不是很有用(您将失去分隔符空格和名称空间之间的区别)。我会同意他的回答。(此外,我已对其进行了编辑以删除引号,因为该模式不会在引号内扩展。)
(我距离删除这个答案只有一个编辑:)