如何在Bash脚本中处理通配符参数里含空格的文件名?
解决Bash脚本处理带空格文件名的问题
你的问题根源在于没有给$@添加双引号,导致Shell将带空格的文件名按空白字符拆分成了多个独立参数。
修改后的脚本代码
#!/bin/bash for file in "$@" do echo "Processing $file" done
原理说明
在Bash中:
- 不带引号的
$@会按照IFS(默认是空格、制表符、换行符)拆分所有参数,带空格的文件名会被拆成多个项 - 加上双引号的
"$@"会完整保留每个参数的原始形态,不管参数里包含空格、特殊字符还是换行符
当你执行./myscript.sh *.jpg时,Shell会先将通配符展开为匹配的文件名列表(包括带空格的file two.jpg),每个文件名作为独立参数传递给脚本。"$@"会原样接收这些参数,确保带空格的文件名被当作单个对象处理。
这个写法完全兼容你使用的GNU bash 3.2.57版本,无论通配符是*还是指定扩展名的*.jpg,也不管文件有没有扩展名,都能正确处理带空格的文件名。
内容的提问来源于stack exchange,提问作者Ben Holness
相关产品推荐
相关产品推荐

