Answers:
==
是的bash
特定别名=
,它执行字符串(词法)比较而不是-eq
数字比较。(这是从Perl倒过来的:单词样式运算符是数字,符号运算符是词法。)
-eq
告诉bash
将字符串解释为整数(0
如果字符串不是数字,则在没有警告的情况下生成)。
[ 01 -eq 1 ]
但是[ 01 != 1 ]
。
==
作为[
运算符是非标准的,不应使用,但它不是bash特定的。它由ksh引入,并由zsh(尽管首先=
需要引用),yash和GNU [
实用程序(以及在某些系统上至少以ksh脚本实现的任何此类实用程序)支持。
$ if [ "hello" -eq 0 ]; then echo true; fi
bash:[:你好:预期为整数表达式
详细阐述bollovan的答案 ...
字符串没有>=
或<=
比较运算符。但是您可以将它们与((...))
算术命令一起使用以比较整数。
您还可以使用其他字符串比较操作符(==
,!=
,<
,>
,但没有=
),如果你里面用它们来比较整数((...))
。
例子
[[ 01 -eq 1 ]]
和(( 01 == 1 ))
都进行整数比较。两者都是对的。[[ 01 == 1 ]]
和[ 01 = 1 ]
都进行字符串比较。两者都是错误的。(( 01 -eq 1 ))
并(( 01 = 1 ))
会返回一个错误。注意:并非所有外壳程序都支持[[...]]
双括号语法和双括号语法((...))
。
mksh
/ zsh
除外(在POSIX模式下除外(尽管不是POSIX功能)))(( 010 == 10 ))
将返回false,因为010
它将被视为八进制数字(十进制为8)。
test
/ [
实现没有>=
/ <=
运营商(yash
的[
具有虽然),expr
有这样的运营商,但如果参数被识别为数字会做算术比较(expr 01 '>=' 1
返回true,expr X01 '>=' X1
返回false)。
如果要进行整数比较,最好使用(()),也可以使用> =等。
例:
if (( $UID == 0 )); then
echo "You are root"
else
echo "You are not root"
fi
(( UID == 0 ))
或(( ! UID ))
对此很重要。请注意,这((...))
是非标准的(此ksh
功能也受变体支持bash
并zsh
带有变体)。
[ $UID -eq 0 ]
,而不是[ $UID -eq 0]
。