为什么bash遍历字符串变量时会将问号转换为短横线?
问题原因
该输出异常是Bash的通配符(路径名扩展)机制导致的,触发逻辑如下:
- 你写的
for v in $var中$var没有用双引号包裹,Bash对未加引号的变量会先后执行单词拆分、路径名扩展两步处理。 - 你的
var值拆分后得到三个片段:bonjour、?、hello,其中?是Bash内置通配符,作用是匹配当前工作目录下所有名称为单个字符的文件。 - 你当前运行脚本的目录下,正好存在且仅存在一个名称为单个短横线
-的文件,因此通配符?被自动替换为了匹配到的文件名-,就出现了不符合预期的输出。
修复方案
可以选择任意一种方式解决:
- 脚本开头关闭路径名扩展功能:
set -f i=0 var='bonjour ? hello' for v in $var do ((i++)) echo -e "$i)$v" done
- 改用数组存储要遍历的元素,避免通配符被意外展开:
i=0 # 用数组定义元素,带特殊字符的元素手动加引号包裹 var=(bonjour '?' hello) for v in "${var[@]}" do ((i++)) echo -e "$i)$v" done
内容的提问来源于stack exchange,提问作者programmer
相关产品推荐
相关产品推荐

