如果我输入:
echo "1 the
dquote> 2 quick
dquote> 3 brown" | while read -a D; do echo "${D[1]}--${D[0]}"; done
在 bash 中它说:
the--1
quick--2
brown--3
但在 zsh 中它说:
zsh: bad option: -a
为什么?我该怎么办?
最佳答案
在两个 shell 中 read
是一个内置的。它们具有相同的目的,但实现和选项不同。
为了读入 zsh
中的数组, read
需要选项-A
(而不是 -a
):
echo "1 the
2 quick
3 brown" | while read -A D; do echo $D[2]--$D[1]; done
<小时/>
注意: zsh
之间还有更多差异和bash
:
- 在
zsh
数组默认从 1 开始编号,如bash
他们从零开始。 -
echo $ARRAY
prints 输出zsh
中的所有元素但只有bash
中的第一个元素 - 打印
sh
中数组的第三个元素您可以使用echo $ARRAY[3]
。在bash
需要用大括号来分隔下标,第三个元素的下标也是2
:echo ${ARRAY[2]}
. 在
zsh
通常不需要引用参数扩展来正确处理带有空格的值。例如FILENAME="no such file" cat $FILENAME
将仅在
zsh
中打印一条错误消息:cat: 'no such file': No such file or directory
但
bash
中有三个错误消息:cat: no: No such file or directory cat: such: No such file or directory cat: file: No such file or directory
在
zsh
内置echo
默认情况下评估转义码。在bash
您需要通过-e
对此的论据。echo 'foo\tbar'
zsh
:foo bar
bash
:foo\tbar
…
一般来说,重要的是要记住,而 zsh
和bash
相似,但远非相同。
关于arrays - 为什么 zsh 中 read -a 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36453146/