zsh:未定义变量时引发错误

时间:2016-01-05 11:53:33

标签: linux shell unix zsh

使用zsh(或者通常使用shell脚本)的一个令人讨厌的方面是,如果您输入错误的变量名称,并且结果名称不存在,则会将其静默地视为空字符串,这会使错误变得困难发现:

if somecondition
then
  myvar=55
else
  my_var=66
fi
echo $MyVar # Oops

我知道此规则的存在是为了与旧的Bourne shell兼容。我也知道在访问变量时我可以明确地捕获此错误:

echo ${MyVar?NOT SET}

但是如果我在每次变量访问时都这样做,就会导致代码变得丑陋。由于我有习惯明确初始化我的所有变量,所以我正在寻找某种方式,当访问shell变量或环境变量时,zsh会自动溢出错误消息,而这些变量尚未设置。有没有办法做到这一点?我已经查看了zshoptions手册页,但没有找到合适的内容。

2 个答案:

答案 0 :(得分:2)

In not just zsh but other shells as well, set -u makes references to unset variables an error.

That said, many scripts will not work unmodified when using this option: [[ $foo ]] can no longer be used to check whether foo was provided by the outer environment, requiring [[ ${foo-} ]] instead.

答案 1 :(得分:1)

要模仿Charles Duffy的答案,并且在使用nounset时作为此类测试的示例(在zsh shell中),您可以考虑这个git commit(对于git本身):<登记/> 请commit 34d8f5a查看Ville Skyttä (scop)(2016年6月6日) (由Junio C Hamano -- gitster --commit 8162401合并,2016年7月6日)

  

git-prompt.sh:请勿在{{1​​}},${ZSH,BASH}_VERSION

上出错      

当shell处于“$short_sha”或“nounset”模式时,引用set -uunset个变量会导致错误。
  保护null$ZSH_VERSION,并在使用前初始化$BASH_VERSION

$short_sha