-gt
大于
if [ "$a" -gt "$b" ]
-ge
大于等于
if [ "$a" -ge "$b" ]
-lt
小于
if [ "$a" -lt "$b" ]
-le
小于等于
if [ "$a" -le "$b" ]
<
小于(在双括号中使用)
(("$a" < "$b"))
<=
小于等于(在双括号中使用)
(("$a" <= "$b"))
>
大于(在双括号中使用)
(("$a" > "$b"))
>=
大于等于(在双括号中使用)
(("$a" >= "$b"))
字符串比较
=
等于
if [ "$a" = "$b" ]
==
等于
if [ "$a" == "$b" ]
与=等价,不过,==比较操作符在双中括号对和单中括号对中的行为是不同的.我们看看实例,理解一下:
[cpp] view plaincopyprint
#!/bin/bash
a=abcdef
if [[ $a == ab* ]]
then
echo "result1: true"
else
echo "result1: false"
fi
if [[ $a == "ab*" ]]
then
echo "result2: true"
else
echo "result2: false"
fi
if [ $a == abcdef ]
then
echo "result3: true"
else
echo "result3: false"
fi
if [ $a == "ab*" ]
then
echo "result4: true"
else
echo "result4: false"
fi
if [ $a == ab* ]
then
echo "result5: true"
else
echo "result5: false"
fi
exit 0
#!/bin/bash
a=abcdef
if [[ $a == ab* ]]
then
echo "result1: true"
else
echo "result1: false"
fi
if [[ $a == "ab*" ]]
then
echo "result2: true"
else
echo "result2: false"
fi
if [ $a == abcdef ]
then
echo "result3: true"
else
echo "result3: false"
fi
if [ $a == "ab*" ]
then
echo "result4: true"
else
echo "result4: false"
fi
if [ $a == ab* ]
then
echo "result5: true"
else
echo "result5: false"
fi
exit 0结果:
[cpp] view plaincopyprint
root@ubuntu:~/resource/shell-study/0427-2013# ./test2
result1: true
result2: false
result3: true
result4: false
result5: false
root@ubuntu:~/resource/shell-study/0427-2013# ./test2
result1: true
result2: false
result3: true
result4: false
result5: false
分析:
1.只要前两个字符为“ab”就为true
2.意思是变量a只有是“ab*”这三个字符时跟后面比较的字符完全一致才为true
3.就是完全比配的情况,返回肯定是true
4.和第二个是一样的
5.这个就是比较特殊的情况,我的理解是在单【】中文字扩展匹配和单词分割有效,所以不能采用这么模糊比较的方法,模糊比较必须使用双【【】】
!=
不等号
if [ "$a" != "$b" ]
这个操作符将在[[ ... ]]结构中使用模式匹配.
<
小于, 按照ASCII字符进行排序
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
注意"<"使用在[ ]结构中的时候需要被转义.
>
大于, 按照ASCII字符进行排序
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
注意">"使用在[ ]结构中的时候需要被转义.
-z
字符串为"null", 意思就是字符串长度为零
-n
字符串不为"null".当-n使用在中括号中进行条件测试的时候, 必须要把字符串用双引号引用起来. 如果采用了未引用的字符串来使用! -z, 甚至是在条件测试中括号中只使用未引用的字符串的话, 一般也是可以工作的, 然而, 这是一种不安全的习惯. 习惯于使用引用的测试字符串才是正路.
实例一
[cpp] view plaincopyprint
#!/bin/bash
a=4
b=5
# 这里的"a"和"b"既可以被认为是整型也可被认为是字符串.
# 这里在算术比较与字符串比较之间是容易让人产生混淆, 因为Bash变量并不是强类型的.
# Bash允许对于变量进行整形操作与比较操作.但前提是变量中只能包含数字字符.
# 不管怎么样, 还是要小心.
if [ "$a" -ne "$b" ]
then
echo "$a is not equal to $b"
echo "(arithmetic comparison)"
fi
if [ "$a" != "$b" ]
then
echo "str($a) is not equal to str($b)."
echo "(string comparison)"
# "4" != "5"
# ASCII 52 != ASCII 53
fi
exit 0
#!/bin/bash
a=4
b=5
# 这里的"a"和"b"既可以被认为是整型也可被认为是字符串.
# 这里在算术比较与字符串比较之间是容易让人产生混淆, 因为Bash变量并不是强类型的.
# Bash允许对于变量进行整形操作与比较操作.但前提是变量中只能包含数字字符.
# 不管怎么样, 还是要小心.
if [ "$a" -ne "$b" ]
then
echo "$a is not equal to $b"
echo "(arithmetic comparison)"
fi
if [ "$a" != "$b" ]
then
echo "str($a) is not equal to str($b)."
echo "(string comparison)"
# "4" != "5"
# ASCII 52 != ASCII 53
fi
exit 0结果:
[cpp] view plaincopyprint
root@ubuntu:~/resource/shell-study/0427-2013# ./test3
4 is not equal to 5
(arithmetic comparison)
str(4) is not equal to str(5).
(string comparison)
root@ubuntu:~/resource/shell-study/0427-2013# ./test3
4 is not equal to 5
(arithmetic comparison)
str(4) is not equal to str(5).
(string comparison)
-ne比较的是两个整数,!=比较的是两个字符串
针对判断字符串是否为空,还是要特别说一下吧,比较特殊:
[cpp] view plaincopyprint
#!/bin/bash
# -n
if [ -n $string1 ];then
echo "String \"string1\" is not null."
else
echo "String \"string1\" is null."
fi
#This is the best way
if [ -n "$string2" ];then