bash-在未向脚本传递任何参数时,分配以.suite结尾的所有文件

bash-在未向脚本传递任何参数时,分配以.suite结尾的所有文件,bash,Bash,我有一个脚本,您可以将测试套件作为参数传递给: $ 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

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

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

又短又甜:

local suites=${@:-*.suite}
(双关语半意)

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

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

(我只需要编辑一下就可以删除这个答案:)

我会这样做:

if (( ! $# )); then
    set -- *.suite
fi
现在,无论用户是指定文件名还是默认文件名,文件名都是$1、$2等格式

一些注意事项:

您分配给
套件的任务似乎没有产生任何有用的结果;它不是一个数组,因此您可以得到一个以空格分隔的文件名的字符串,或者是未展开的glob
“*.suites”
。我猜你以后会以某种方式结束
eval
ing,但这是个坏主意-文件名中的任何空格或时髦字符都会把事情搞砸。我建议在参数上循环并单独处理它们,或者使用实际数组

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

suites=( "$@" )

然后用
“${suites[@]}”

检索整个内容(同样,正确地分隔),glob是否会在引号中为您展开?或者您计划在使用时将其扩展?在引号内。如果
$@
为null或未设置,则
后面的单词:-
在将其值分配给
套件之前会经历模式扩展。我看到的不是这种行为,fwiw。如果我转到包含一些
.jpg
文件的目录,说
echo“${unset:-*.jpg}”
我会看到
*.jpg
。我必须在前面抛出一个
eval
使其展开。即使没有引号,它也不会展开<代码>x=${@:-*.lrn};回声“$x”
产生
*.lrn
。当然,
echo$x
不带引号会给出与echo匹配的文件名列表,但这是不同的。我可以发誓我用引语测试过。如果没有引号,只要至少有一个匹配的文件或设置了
nullglob
,它就会展开。请注意,
*.suites
不会匹配以
结尾的文件名。suites
没有最后的
s
@MarkReed Thx,这确实是一个打字错误。