如果您执行脚本
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
答案 0 :(得分:2)
实际上可以在 zsh (zshexpn(1))和 bash (bash(1))的手册页中找到解释。
对于两个shell,替换文本也受参数扩展的影响:
zshexpn(1):
[...]任何替换的替换文本本身都受参数扩展[...]
的约束
的bash(1):
在下面的每个案例中,
word
都会受到波浪扩展,参数扩展[...]
以下是有关替换的相关部分(由我强调):
对于${1:-$X}
,两个shell的行为相同:
zshexpn(1):
${name:-word}
如果
name
是[...]非空,则替换其值;否则替换word
。
的bash(1):
${parameter:-word}
[...]如果
parameter
未设置或为空,则word
的扩展将被替换。否则,参数的值被替换
虽然 zsh 联机帮助页未明确提及word
再次展开,但上述规则涵盖了这一点。导致在您的示例中打印abcd
。
对于${1:?$X}
, zsh 的措辞略有不同:
zshexpn(1):
${name:?word}
[...]如果
name
都设置为非空,则替换其值;否则,打印word
并退出shell。
的bash(1):
${parameter:?word}
如果
parameter
为空或未设置,则word
[...]的扩展写入标准错误和shell(如果它不是交互式的)退出。否则,参数的值将被替换。
对于 bash ,明确声明word
已展开。但是对于 zsh ,它表明word
已打印而未被替换。这也意味着它不受上述规则的约束。