如何在zsh中检查变量是否已设置?

34

在zsh中,测试变量是否已设置的规范/惯用方法是什么?

if ....something.... ; then
    print "Sweet, that variable is defined"
else
    print "That variable is not defined"
fi

这里是bash的SO答案


1
可能是如何在Bash中检查变量是否设置?的重复。 - Jens
1
呃,我的意思是, zsh 的语法,但 POSIX sh 的语法在这里也适用。 - Charles Duffy
1
编辑以澄清。Bash问题没有提供规范的zsh语法。 - paulmelnikow
1
bash 的原始版本除了作为一个符合 POSIX 标准的 shell 以外,实际上并没有什么用处;它已经过时多年了。在 OS X Sierra 中,/bin/zsh 应该是 5.2 版本。 - chepner
你说得对,是5.2。那是个笔误。 - paulmelnikow
显示剩余2条评论
2个回答

44

在 Zsh 中通常这样做:

if (( ${+SOME_VARIABLE} )); then
例如:
if (( ${+commands[brew]} )); then
    brew install mypackage
else
    print "Please install Homebrew first."
fi

在Zsh 5.3及更高版本中,您可以在条件表达式中使用-v运算符:

if [[ -v SOME_VARIABLE ]]; then

符合POSIX标准的测试将会是:

if [ -n "${SOME_VARIABLE+1}" ]; then

1
@chepner 这不应该是-n而不是-z吗?-z是相反的。 - Zenexer
一种便携式的检查变量是否设置(即使为null值)的方法:isset() { [[ $(eval echo "\${${1}+1}") ]]; } - Jonathan H
如果您只是手动检查,请输入 echo "${+SOME_VAR}" - cambunctious

18

在条件表达式中使用-v 操作符(在zsh 5.3中引入)。

% unset foo
% [[ -v foo ]] && echo "foo is set"
% foo=
% [[ -v foo ]] && echo "foo is set"
foo is set

我知道这很明显,但是只是为了强调一下,在变量前面不应该加上美元符号。我出于习惯性地输入了-v $foo,然后花了很长时间试图弄清楚为什么它不起作用,直到我注意到我没有仔细阅读答案,应该是-v foo!!!! - undefined
1
确实;-v 接受一个 名称,如果您提供了参数扩展,那么使用的是结果值作为名称。(我不敢说在 shell 中的任何东西都是“显而易见”的 :) ) - undefined
嗯,对我来说并不明显,但那是因为像大多数人一样,我现在做事都匆匆忙忙,试图同时做七件事情,所以不仔细阅读,这就是我决定发表评论的原因;-) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接