我有多个字符串,如“a b”,“c d”,“foo bar”等.我想循环这组字符串,并对这些字符串执行一个操作.在这个动作中,我调用了多个其他脚本,所以我不想改变这个循环的IFS,因为它可能会破坏其他脚本的调用.这就是为什么我试图逃避这些字符串中包含的空格,但没有成功.
所以例如我期望得到
a b c d
我试过以下:
#!/bin/sh x="a b" y="c d" echo "Attempt 1" all="$x $y" for i in $all ; do echo $i done echo "Attempt 2" all="a\ b c\ d" for i in $all ; do echo $i done echo "Attempt 3" all=($x $y) for i in ${all[@]} ; do echo $i done echo "Attempt 4" all='"'$x'" "'$y'"' for i in $all ; do echo $i done echo "Attempt 5" for i in "$x" "$y" ; do echo $i done echo "Attempt 6" all2=("a b" "c d"); for i in ${all2[@]}; do echo $i done echo "Attempt 7" all3="a b c d" echo $all3| while read i; do echo $i done
只有尝试5成功,但我想这样做,而不必每个字符串声明一个变量(维护时会很痛苦).我刚刚介绍了x和y进行测试,但是想法是在一个变量中声明集合“a b”和“c d”.
您需要在双引号中包含变量,其中all =(“$x”“$y”)和“${all [@]}”):
x="a b" y="c d" echo "Attempt XX" all=("$x" "$y") for i in "${all[@]}" ; do echo "$i" done
执行它返回:
Attempt XX a b c d
更新
为避免为每个字符串使用不同的变量,请执行以下操作:
all=("a b" "c d") for i in "${all[@]}" ; do echo "$i" done