文件测试操作符 (二)

2014-11-24 11:22:28 · 作者: · 浏览: 16

-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