Shell脚本中如何在列表循环中正确打印特殊字符*?
解决Shell脚本中for循环遍历列表时通配符被展开的问题
问题原因
你遇到的问题是Shell的**路径扩展(Globbing)**机制导致的:当直接使用$list遍历字符串时,Shell会先对变量内容进行单词拆分,再将*这类通配符替换成当前目录下的所有文件列表,所以输出的是文件内容而非*本身。你之前修改echo的写法没用,因为通配符的展开发生在for循环解析$list的阶段,到echo时已经是处理后的结果了。
解决方案
方法一:使用数组存储列表(推荐)
用数组保存每个元素,能确保每个项都被当作独立字符串处理,不会触发通配符扩展:
#!/bin/sh list=("bla1" "bla2" "*" "bla3") for i in "${list[@]}" do echo "$i" done
- 解析:
"${list[@]}"会遍历数组的每个元素,且每个元素都保持原本的字符串形态,*不会被解析为通配符。
方法二:临时关闭路径扩展
如果必须使用字符串存储列表,可以在遍历前关闭Shell的通配符解析功能,遍历完成后再恢复:
#!/bin/sh list="bla1 bla2 * bla3" set -f # 关闭路径扩展,禁止通配符解析 for i in $list do echo "$i" done set +f # 恢复路径扩展,不影响后续脚本逻辑
- 解析:
set -f会禁用Shell的Globbing功能,此时*会被当作普通字符处理;遍历结束后用set +f恢复默认行为,避免影响脚本其他部分。
内容的提问来源于stack exchange,提问作者Abderrahim Elbarrak
相关产品推荐
相关产品推荐

