如果我输入:
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 $ARRAY
print输出所有元素,zsh
但只输出第一个元素bash
sh
您可以使用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
相似,但它们远非相同.