如何在Bash的for循环中正确展开含空格的变量
Bash中保留带空格元素的for循环解决方案
直接执行以下代码时,因为用引号将a2 a3包裹,Bash会将其识别为单个元素,循环输出符合预期:
for i in a1 'a2 a3' do echo ${i} done
输出:
a1 a2 a3
但如果直接把a1 'a2 a3'赋值给普通变量后用for i in ${VAR},Bash会对未加引号的变量展开结果做单词分割,把a2和a3拆成两个独立元素,导致不符合预期。以下是几种正确的处理方式:
方法1:使用数组声明变量
这是最推荐的方式,数组可以原生保留每个元素的完整性:
# 声明数组,每个元素单独赋值 VAR=("a1" "a2 a3") # 遍历数组时用双引号包裹"${VAR[@]}",确保每个元素不被拆分 for i in "${VAR[@]}" do echo "$i" done
方法2:用read命令拆分普通变量到数组
如果变量已经是包含引号的字符串形式,可以用read -a命令将其正确拆分到数组:
VAR="a1 'a2 a3'" # -r 禁止反斜杠转义,-a 将输入拆分到数组arr read -r -a arr <<< "$VAR" for i in "${arr[@]}" do echo "$i" done
方法3:使用eval(不推荐)
eval会重新解析变量内容,将引号作为语法的一部分处理,但这种方式存在安全风险——如果变量中包含恶意命令,eval会直接执行,因此仅在确定变量内容安全时使用:
VAR="a1 'a2 a3'" eval "for i in $VAR; do echo \"\$i\"; done"
内容的提问来源于stack exchange,提问作者justin8976
相关产品推荐
相关产品推荐

