使用变量存储通配符执行ls命令失效的原因咨询
问题原因解释
这是Shell的通配符扩展时机导致的差异:
直接执行
ls -dq *.sb | wc -l时,Shell会先对*.sb做路径扩展(通配符匹配)——它会遍历当前目录,把*.sb替换成所有后缀为.sb的实际文件名,再把这些文件名作为参数传给ls。此时ls处理的是真实存在的文件,自然能正确统计数量。当你把
*.sb存入变量search,再用"$search"调用时,双引号会阻止Shell的通配符扩展。这时候ls收到的参数就是字面意义的字符串*.sb,而你的目录里根本没有名为*.sb的文件,所以ls报错找不到,wc -l统计的是ls的输出行数(此时没有正常输出,结果就是0)。
如果想让变量中的通配符生效,可以去掉双引号直接写ls -dq $search | wc -l,但要注意如果文件名包含空格、特殊字符时,这种写法可能会出问题——更稳妥的方式是用数组存储匹配结果,比如:
search=(*.sb) echo "${#search[@]}"
这样直接统计数组长度,不用调用ls和wc,更可靠。
内容的提问来源于stack exchange,提问作者Ken Reid
相关产品推荐
相关产品推荐

