如果我输入:
echo "1 the
dquote> 2 quick
dquote> 3 brown" | while read -a D; do echo "${D[1]}--${D[0]}"; done
Run Code Online (Sandbox Code Playgroud)
在bash中它说:
the--1
quick--2
brown--3
Run Code Online (Sandbox Code Playgroud)
但在zsh中它说:
zsh: bad option: -a
Run Code Online (Sandbox Code Playgroud)
为什么?我该怎么做呢?
两个炮弹read都是内置的.它有相同的目的,但实现和选项不同.
要读入数组zsh,read需要选项-A(而不是-a):
echo "1 the
2 quick
3 brown" | while read -A D; do echo $D[2]--$D[1]; done
Run Code Online (Sandbox Code Playgroud)
注意:zsh和之间还有很多不同之处bash:
zsh数组中,默认情况下编号为1,bash从零开始.echo $ARRAYprint输出所有元素,zsh但只输出第一个元素bashsh您可以使用echo $ARRAY[3].在bash括号中需要分隔下标,第三个元素的下标也是2:echo ${ARRAY[2]}.在zsh您通常不需要引用参数扩展,以便正确处理带有空格的值.例如
FILENAME="no such file"
cat $FILENAME
Run Code Online (Sandbox Code Playgroud)
将只打印一条错误消息zsh:
cat: 'no such file': No such file or directory
Run Code Online (Sandbox Code Playgroud)
但有三条错误消息bash:
cat: no: No such file or directory
cat: such: No such file or directory
cat: file: No such file or directory
Run Code Online (Sandbox Code Playgroud)在zsh内置中echo默认评估转义码.在bash你需要传递-e参数.
echo 'foo\tbar'
Run Code Online (Sandbox Code Playgroud)
zsh:
foo bar
Run Code Online (Sandbox Code Playgroud)
bash:
foo\tbar
Run Code Online (Sandbox Code Playgroud)...
一般来说,重要的是要记住,虽然zsh和bash相似,但它们远非相同.