Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 为什么读a在zsh中失败_Arrays_Zsh - Fatal编程技术网

Arrays 为什么读a在zsh中失败

Arrays 为什么读a在zsh中失败,arrays,zsh,Arrays,Zsh,如果我键入: 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: bad option: -a 但在zsh中,它说: the--1 quick--2 brown--3 zsh: bad option: -a 为什么??我应该怎么做呢?在两个shell中,

如果我键入:

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: bad option: -a
但在zsh中,它说:

the--1
quick--2
brown--3
zsh: bad option: -a

为什么??我应该怎么做呢?

在两个shell中,read是一个内置的。它的目的相同,但实施和选择不同

要在
zsh
中读取数组,
read
需要选项
-A
(而不是
-A
):

echo“1
2快速
3棕色“|读时-A D;不回显$D[2]--$D[1];完成

注意:
zsh
bash
之间有更多的区别:

  • 默认情况下,在
    zsh
    中,数组从一开始编号,而在
    bash
    中,数组从零开始编号
  • echo$ARRAY
    输出
    zsh
    中的所有元素,但仅输出
    bash中的第一个元素
  • 要在
    sh
    中打印数组的第三个元素,可以使用
    echo$array[3]
    。在
    bash
    中,需要大括号来分隔下标,第三个元素的下标也是
    2
    echo${ARRAY[2]}
  • zsh
    中,为了正确处理带有空格的值,通常不需要引用参数展开式。比如说

    FILENAME=“没有这样的文件”
    cat$FILENAME
    
    将在
    zsh
    中只打印一条错误消息:

    cat:“没有这样的文件”:没有这样的文件或目录
    
    但是
    bash
    中有三条错误消息:

    cat:no:没有这样的文件或目录
    cat:这样:没有这样的文件或目录
    cat:file:没有这样的文件或目录
    
  • zsh
    中,默认情况下,内置
    echo
    计算转义码。在
    bash
    中,您需要为此传递
    -e
    参数

    echo'foo\tbar'
    
    zsh

    foo-bar
    
    bash

    foo\tbar
    

一般来说,重要的是要记住,虽然
zsh
bash
是相似的,但它们远非相同。

Hmm。它似乎不使用-a表示其他任何东西。似乎是一种奇怪的毫无意义的不兼容。两个shell都不想与另一个shell兼容。它们都试图与POSIX兼容,但无论是
-a
还是
-a
都不是POSIX变量
read
的选项。我猜
zsh
使用
-A
与其
set
内置一致,后者也使用
-A
来设置数组。顺便说一句:情况正好相反
bash
(1996年的2.0版)在使用
-A
时没有遵循
zsh
的示例(1994年的2.5版),这很奇怪,因为它没有将
-A
用于任何其他用途我认为zsh确实试图在没有任何东西反对它的时候与bash兼容。zsh可能是第一个,但bash的受欢迎程度要高出数千倍。zsh没有将-a用于其他任何东西,因此我认为它应该只做一些实用的事情。1996年是20年前,就像我写的:
bash
zsh
是非常不同的,否则的话,只会导致问题。更改此选项不会更改此选项。真的,为什么
zsh
要打破一个既定的行为,而更像
bash
?如果需要bash构造,请使用
bash
。如果您想要可移植代码,请使用符合POSIX的结构。如果您想利用功能
zsh
,则需要使用zsh构造,其中许多构造与
bash
中的构造或多或少有所不同。