我有多个字符串,如"a b","c d","foo bar"等.我想循环遍历这组字符串并对其中的每一个执行操作.在这个动作中,我调用了多个其他脚本,所以我不想为这个循环更改IFS,因为它可能会破坏我对其他脚本的调用.这就是为什么我试图逃避这些字符串中包含的空格但没有成功.
所以我希望得到
a b
c d
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法:
#!/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
Run Code Online (Sandbox Code Playgroud)
只尝试5成功,但我想这样做而不必为每个字符串声明一个变量,(维护会很痛苦).我刚刚介绍了x和y进行测试,但想法是在一个变量中声明集合"a b"和"c d".
fed*_*qui 27
您需要将变量包装在双引号内,包括all=("$x" "$y")
和"${all[@]}"
:
x="a b"
y="c d"
echo "Attempt XX"
all=("$x" "$y")
for i in "${all[@]}" ; do
echo "$i"
done
Run Code Online (Sandbox Code Playgroud)
执行它返回:
Attempt XX
a b
c d
Run Code Online (Sandbox Code Playgroud)
要避免为每个字符串使用不同的变量,请执行以下操作:
all=("a b" "c d")
for i in "${all[@]}" ; do
echo "$i"
done
Run Code Online (Sandbox Code Playgroud)
你的问题是缺乏引用.没有引用,就会出现单词分裂:
$ x="a b"; y="c d"; all=("$x" "$y"); for i in "${all[@]}"; do echo "$i"; done
a b
c d
Run Code Online (Sandbox Code Playgroud)
使用阵列是最完美的解决方案,以及,当然,x
并y
都是多余的.你也可以这样做:
$ all=("a b" "c d"); for i in "${all[@]}"; do echo "$i"; done
a b
c d
Run Code Online (Sandbox Code Playgroud)