Bash循环与echo异常:字符串大写字符被随机移除
Bash枚举字符串时大写字符莫名丢失的问题解决
在Bash里枚举字符串时碰到怪事:输入rtpwatcher_Class_Sync_License_Capture,用echo输出后变成rtpwatcher_Class_ ync_ icense_Capture,大写字符像是被随机删了。
原问题代码
hb_names=("rtpwatcher_Truckmove_Statemachine" "rtpwatcher_Class_Sync_License_Capture") hb_test="rtpwatcher_Truckmove_Statemachine,rtpwatcher_Class_Sync_License_Capture" for i in $(echo $hb_test | tr ',' '\n') do echo $i done for hb in ${hb_names[@]}; do echo $hb done
异常输出结果
rtpwatcher_Truckmove_ tatemachine rtpwatcher_Class_ ync_ icense_Capture rtpwatcher_Truckmove_ tatemachine rtpwatcher_Class_ ync_ icense_Capture
试了下,如果字符串里只有单个大写字符(比如rtpwatcher_Class_sync_license_capture),输出就正常。
解决方法
这是因为Bash里变量或数组引用不加双引号的话,会触发单词拆分和路径名扩展——如果字符串里的字符刚好能匹配当前目录下的文件名通配符,就会被莫名替换掉。修正后的代码如下:
数组遍历修正
for hb in "${hb_names[@]}"; do echo "${hb}" done
逗号分隔字符串遍历修正(针对hb_test)
原来的第一个循环用$(echo ...)拆分字符串也容易出问题,推荐用更可靠的方式:
IFS=',' read -ra hb_arr <<< "$hb_test" for i in "${hb_arr[@]}"; do echo "${i}" done
核心要点就是给数组引用、变量引用加上双引号,确保每个字符串元素被当作完整的个体处理,不会被意外拆分或扩展。
内容的提问来源于stack exchange,提问作者SATANS'418
相关产品推荐
相关产品推荐

