![Zsh 引用奇怪的行为](https://linux22.com/image/165242/Zsh%20%E5%BC%95%E7%94%A8%E5%A5%87%E6%80%AA%E7%9A%84%E8%A1%8C%E4%B8%BA.png)
为什么这样做:
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