Zsh 引用奇怪的行为

Zsh 引用奇怪的行为

为什么这样做:

for i in 0 foo 1 'bar t ttt' 2 baz 3 '   ' 4 'qux ' 5 ''; do echo $i; done

(导致 :

0
foo
1
bar t ttt
2
baz
3

4
qux 
5

不等于:

a="0 foo 1 'bar t ttt' 2 baz 3 '   ' 4 'qux ' 5 ''"
for i in `echo $a`; do echo $i; done

这使 :

0
foo
1
'bar
t
ttt'
2
baz
3
'
'
4
'qux
'
5
''

答案1

第一个循环迭代数组的成员,而第二个循环迭代字符串,该字符串在空格上分割。如果您希望第二个循环产生与第一个循环相同的输出,则需要声明a为数组:

a=( 0 foo 1 'bar t ttt' 2 baz 3 '   ' 4 'qux ' 5 '' )
for i in $a; do echo $i; done

或者,如果您仅限于使用字符串,则需要将其拆分为 shell 单词(而不是空格),然后删除单引号:

a="0 foo 1 'bar t ttt' 2 baz 3 '   ' 4 'qux ' 5 ''"
for i in ${(Q)${(z)a}}; do echo $i; done

相关内容