很简单的问题:说我有一组文件:
a1.txt
a2.txt
a3.txt
b1.txt
Run Code Online (Sandbox Code Playgroud)
我使用以下命令:
ls a*.txt
Run Code Online (Sandbox Code Playgroud)
它将返回:
a1.txt a2.txt a3.txt
Run Code Online (Sandbox Code Playgroud)
在使用*模式时,是否有一种方法可以告诉bash脚本将返回多少结果.在上面的例子中,如果我使用*.txt,答案应该是3,如果我使用*1.txt,答案应该是2.
评论使用ls:
ls.这是非常不可预测的,因为当文件名具有"异常字符"(例如空格)时会中断.ls依赖于实现.特定实现可能以不同方式格式化输出关于在Greg Wooledge维护的bash wiki上解析ls输出的缺陷,有一个非常好的讨论 .
使用bash数组的解决方案
由于上述原因,使用bash语法将是更可靠的选项.您可以使用glob来填充具有所有匹配文件名的bash数组.然后你可以要求bash数组的长度来获得匹配的数量.以下代码段应该有效.
files=(a*.txt) && echo "${#files[@]}"
Run Code Online (Sandbox Code Playgroud)
要保存变量中的匹配数,您可以执行以下操作:
files=(a*.txt)
count="${#files[@]}"
Run Code Online (Sandbox Code Playgroud)
此方法的另一个优点是,您现在还可以在数组中匹配文件,您可以迭代它们.
注意:虽然我不断重复上面的bash语法,但我相信上面的解决方案适用于所有sh -family shell.