我有一个bash变量深度,我想测试它是否等于0.如果是,我想停止执行脚本。到目前为止,我有:
zero=0;
if [ $depth -eq $zero ]; then
echo "false";
exit;
fi
不幸的是,这会导致:
[: -eq: unary operator expected
(由于翻译可能有点不准确)
请问,如何修改我的脚本以使其正常工作?
答案 0 :(得分:140)
看起来您的depth
变量未设置。这意味着在bash将变量的值替换为表达式之后,表达式[ $depth -eq $zero ]
变为[ -eq 0 ]
。这里的问题是-eq
运算符被错误地用作只有一个参数(零)的运算符,但它需要两个参数。这就是为什么你得到一元运算符错误消息。
编辑:正如 Doktor J 在他对此答案的评论中提到的,避免检查中未设置变量问题的一种安全方法是将变量括在{{1 }}。请参阅他的评论以获得解释。
""
与if [ "$depth" -eq "0" ]; then
echo "false";
exit;
fi
命令一起使用的未设置变量对bash显示为空。您可以使用以下所有评估为[
的测试来验证这一点,因为true
为空或未设置:
xyz
if [ -z ] ; then echo "true"; else echo "false"; fi
xyz=""; if [ -z "$xyz" ] ; then echo "true"; else echo "false"; fi
答案 1 :(得分:55)
双括号(( ... ))
用于算术运算。
双方括号[[ ... ]]
可用于比较和检查数字(仅支持整数),使用以下运算符:
· NUM1 -eq NUM2 returns true if NUM1 and NUM2 are numerically equal.
· NUM1 -ne NUM2 returns true if NUM1 and NUM2 are not numerically equal.
· NUM1 -gt NUM2 returns true if NUM1 is greater than NUM2.
· NUM1 -ge NUM2 returns true if NUM1 is greater than or equal to NUM2.
· NUM1 -lt NUM2 returns true if NUM1 is less than NUM2.
· NUM1 -le NUM2 returns true if NUM1 is less than or equal to NUM2.
例如
if [[ $age > 21 ]] # bad, > is a string comparison operator
if [ $age > 21 ] # bad, > is a redirection operator
if [[ $age -gt 21 ]] # okay, but fails if $age is not numeric
if (( $age > 21 )) # best, $ on age is optional
答案 2 :(得分:18)
尝试:
zero=0;
if [[ $depth -eq $zero ]]; then
echo "false";
exit;
fi
答案 3 :(得分:12)
您也可以使用此格式并使用比较运算符,例如'==''< ='
if (( $total == 0 )); then
echo "No results for ${1}"
return
fi
答案 4 :(得分:4)
具体来说:((depth))
。例如,以下内容打印1
。
declare -i x=0
((x)) && echo $x
x=1
((x)) && echo $x
答案 5 :(得分:2)
你可以试试这个:
: ${depth?"Error Message"} ## when your depth variable is not even declared or is unset.
注意:?
之后只有depth
。
或
: ${depth:?"Error Message"} ## when your depth variable is declared but is null like: "depth=".
注意::?
之后的depth
。
如果找到变量depth
null
,它将打印错误消息然后退出。