下面的两个代码段之间是否存在差异?
if [[ $a == "1" ]];then
echo $a
和
if [ $a == "1" ];then
echo $a
此外,我在上述代码段中使用-eq
代替==
时有区别吗?
答案 0 :(得分:4)
至于你的主要问题:它是:Is [[ ]] preferable over [ ] in bash scripts?
的副本[ ... ]
和[[ ... ]]
之间的差异。[[ ... ]]
的解析更像是您在常规编程语言中所期望的,它实现了许多有用的扩展,但它不符合POSIX。至于“当我使用-eq
代替==
时会有区别吗?”:
=
和==
,其Bash替代品,执行字符串比较。
[[ ... ]]
内,如果=
或==
的RHS 未加引号,则将其解释为glob-style pattern 以匹配LHS;将[[ 'a' == '*' ]] && echo match
与[[ 'a' == * ]] && echo match
[ ... ]
(而非[[ ... ]]
)来实现POSIX合规性(可与/bin/sh
一起使用),则应仅使用=
,而不是{{1 }};虽然Bash也在==
内接受==
,但其他shell则不接受。{/ li>
[ ... ]
执行整数比较
存在其他字符串/数字运算符对(例如,-eq
表示字母(字符串)小于... -lt
在文本排序顺序上)。
Bash Conditional Expressions列出了您可以在<
和[ ... ]
内使用的所有运算符(以及[[ ... ]]
,它实际上是test
的别名)。
[ ... ]
内,正则表达式匹配运算符[[ ... ]]
可用 - 请参阅Bash Conditional Constructs 答案 1 :(得分:2)
在bash中,数字比较的处理方式与字符串比较不同
对于数字,
$var1 -eq $var2 // =
$var1 -gt $var2 // >
$var1 -ge $var2 // >=
$var1 -lt $var2 // <
$var1 -le $var2 // <=
$var1 -ne $var2 // !=
对于字符串
$str1 = $str2 // they are equal
str1 != str2 // not equal
str // Returns True if str is not null.
-n str // Returns True if the length of str is greater than zero.
-z str // Returns True if the length of str is equal to zero.
请注意,==与=
相同另请注意,在进行模式匹配时,=〜在双括号比较(这是[条件]与[[条件]]问题的来源)中的运算方式不同。这些比较/运算符都在http://www.tldp.org/LDP/abs/html/comparison-ops.html
解释