zsh(vs. bash)参数扩展异常

时间:2015-03-05 08:48:32

标签: zsh

如果您执行脚本

X=abcd
echo ${1:-$X}
echo ${1?$X}

不传递任何参数,并在bash下执行,输出

abcd
./mrh.sh: line 3: 1: abcd

如果在zsh下运行它,则输出

abcd
mrh.sh:3: 1: -$X

我们看到在$ {...?...}的情况下,替换($ X)在bash下扩展,但不在zsh下扩展。在$ {...:-...}的情况下,$ X在bash和zsh中都被扩展。

我查看了zsh手册页以找到解释,为什么在第二种情况下没有替换$ X,但找不到任何东西。这是zsh中的错误吗?

使用zsh 5.0.6

1 个答案:

答案 0 :(得分:2)

实际上可以在 zsh zshexpn(1))和 bash bash(1))的手册页中找到解释。

对于两个shell,替换文本也受参数扩展的影响:

  • zshexpn(1)

      

    [...]任何替换的替换文本本身都受参数扩展[...]

    的约束
  • 的bash(1)

      

    在下面的每个案例中,word都会受到波浪扩展,参数扩展[...]

以下是有关替换的相关部分(由我强调):

  1. 对于${1:-$X},两个shell的行为相同:

    • zshexpn(1)

        

      ${name:-word}

           

      如果name是[...]非空,则替换其值;否则替换word

    • 的bash(1)

        

      ${parameter:-word}

           

      [...]如果parameter未设置或为空,则word扩展将被替换。否则,参数的值被替换

    虽然 zsh 联机帮助页未明确提及word再次展开,但上述规则涵盖了这一点。导致在您的示例中打印abcd

  2. 对于${1:?$X} zsh 的措辞略有不同:

    • zshexpn(1)

        

      ${name:?word}

           

      [...]如果name都设置为非空,则替换其值;否则,打印word 并退出shell。

    • 的bash(1)

        

      ${parameter:?word}

           

      如果parameter为空或未设置,则word [...]的扩展写入标准错误和shell(如果它不是交互式的)退出。否则,参数的值将被替换。

    对于 bash ,明确声明word已展开。但是对于 zsh ,它表明word已打印而未被替换。这也意味着它不受上述规则的约束。