在bash脚本中,我试图测试变量的存在。但无论我做什么,我的“if”测试都会返回true。这是代码:
ignored-deps-are-not-set () {
if [ -z "${ignored_deps+x}" ]
then
return 0
fi
return 1
}
ignored_deps=1
ignored-deps-are-not-set
echo "ignored-deps function returns: $?"
if [ ignored-deps-are-not-set ]
then
echo "variable is unset"
else
echo "variable exists"
fi
以下是输出:
ignored-deps function returns: 1
variable is unset
当我注释掉设置了ignored_deps的行时的输出。
ignored-deps function returns: 0
variable is unset
无论如何,它表示变量未设置。我错过了什么?
答案 0 :(得分:5)
这一行:
if [ ignored-deps-are-not-set ]
测试字符串'ignored-deps-not-set-set'是否为空。它返回true,因为该字符串不为空。它不执行命令(因此也不执行函数)。
如果要测试是否设置了变量,请使用${variable:xxxx}
符号之一。
if [ ${ignored_deps+x} ]
then echo "ignored_deps is set ($ignored_deps)"
else echo "ignored_deps is not set"
fi
如果${ignored_deps+x}
设置为x
,$ignored_deps
表示法的计算结果为if [ ${ignored_deps:+x} ]
then echo "ignored_deps is set ($ignored_deps)"
else echo "ignored_deps is not set or is empty"
fi
,即使它设置为空字符串也是如此。如果您只想将它设置为非空值,那么也使用冒号:
if ignored-deps-are-not-set
then echo "Function returned a zero (success) status"
else echo "Function returned a non-zero (failure) status"
fi
如果要执行该功能(假设破折号在函数名称中起作用),则:
{{1}}
答案 1 :(得分:2)
你实际上并没有执行这个功能:
if ignored-deps-are-not-set; then ...
在[]
括号内,文字字符串“ignore-deps-are-not-set”被视为true。
答案 2 :(得分:0)
if [ ${myvar:-notset} -eq "notset" ] then
...
答案 3 :(得分:0)
- edit-- 只是意识到它是一个试图调用的函数,惯例是错误的。
请参阅:
Z000DGQD@CND131D5W6 ~
$ function a-b-c() {
> return 1
> }
Z000DGQD@CND131D5W6 ~
$ a-b-c
Z000DGQD@CND131D5W6 ~
$ echo $?
1
Z000DGQD@CND131D5W6 ~
$ if a-b-c; then echo hi; else echo ho; fi
ho
Z000DGQD@CND131D5W6 ~
$ if [ a-b-c ]; then echo hi; else echo ho; fi
hi
Z000DGQD@CND131D5W6 ~
- 编辑结束 -
修复变量名称(请参阅我对您帖子的评论)
然后
请参阅man bash
中的参数扩展部分。
${parameter:?word}:
如果为空或未设置则显示错误。如果参数为null或未设置,则单词的扩展(或者如果单词不存在则为该效果的消息)将写入标准错误,并且如果shell不是交互式,则退出。否则,参数的值将被替换。
答案 4 :(得分:0)
另一种测试变量存在的方法:
if compgen -A variable test_existence_of_var; then
echo yes
else
echo no
fi