shell 脚本编程之比较运算符

测试

测试是用于判断某个条件是否成立,比如测试某个文件是否存在,测试两个字符串是否相等。要特别注意的是,shell 中返回 0 代表测试成功;条件语句、循环语句等结构经常会以“真假”为判断条件,shell 用字符串 true 来表示真,但对于测试来说返回 0 才表示真。这里可能有点绕,其实不用太在意 0 或者非 0 ,只需要知道以 “真” “假” 作为判断条件即可。测试有两种结构,
1. test expression
2. [ expression ] 或 [[ expression ]]
第二种结构 expression 和中括号之间要有空格,两对中括号和一对中括号的区别是两对中括号能够处理特殊字符,而一对中括号里的特殊字符要加上转义字符来处理。

文件操作运算符

文件操作运算符用于文件测试,包括

文件运算符说明
-e文件存在时返回真
-b文件存在且是块文件时返回真
-c文件存在且是字符文件时返回真
-d文件存在且是目录时返回真
-f文件存在且是普通文件时返回真
-x文件存在且是可执行文件时返回真
-p文件存在且为管道文件时返回真
-l文件存在且为链接文件时返回真
-S文件存在且为 socket 文件时返回真
-w文件存在且可写时返回真
-r文件存在且可读时返回真
-s文件存在且大小不为 0 时返回真
F1 -nt F2F1 比 F2 新时返回真
F1 -ot F2F1 比 F2 旧时返回真
#learn_file_compare.sh
#!/bin/bash
if ! test -e file; then
        echo "file no exits!"
        touch file
fi
if ! [ -d dir ]; then
        echo "dir no exits!"
        mkdir dir
fi
[ -x file ]
echo $?
[ -f file ]
echo $?
[ -r file ]
echo $?
[ -w file ]
echo $?
if [ ! -e file2 ]; then
        touch file2
fi
[ file -nt file2 ]
echo $?
[ file -ot file2 ]
echo $?

执行结果

file no exits!
dir no exits!
1
0
0
0
1
0

返回 0 表示测试成功,返回非 0 表示测试失败,if 条件为 0 时成立。第一个测试判断文件 file 是否存在,如果不存在则返回非 0,取非之后就是 0;if 条件为 0 时表示真,则执行 if 逻辑,创建文件 file。第二测试判断目录 dir 是否存在,不存在返回非 0,取非之后就是 0,执行 if 逻辑,创建目录。file 是普通的可读可写文件,不是可执行文件,所以接下来的输出是 1 0 0 0。file2 创建时间比 file 晚,所以 file -nt file2 返回 1,file -ot file2 返回 0。

字符串比较运算符

字符串比较运算符用于字符串测试,主要有字符串大小比较,是否为空等测试

字符串运算符说明
-z字符串为空时返回真
-n字符串不为空时返回真
=两个字符串相等时返回真
!=两个字符串不等时返回真
>第一个字符串大于第二个字符串时返回真
\<第一个字符串小于第二个字符串时返回真
#learn_string_compare.sh
#!/bin/bash
str1=""
str2="hello"
test -n "$str1"
echo $?
test -z "$str1"
echo $?
[ "$str1" = "$str2" ]
echo $?
str1="hellp"
[ "$str1" > "$str2" ]
echo $?
[ "$str1" < "$str2" ]
echo $?
[ "$str1" \> "$str2" ]
echo $?
[ "$str1" \< "$str2" ]
echo $?
[[ "$str1" > "$str2" ]]
echo $?
[[ "$str1" < "$str2" ]]
echo $?

执行结果

1
0
1
0
0
0
1
0
1

str1 和 str2 必须加上 "str1""str2"str1str2 str1 外面的引号也是必须的。看最后的六个输出,一对中括号的情况下,< 和 > 不加转义字符也不会出错,但其执行结果是错误的,可以看到 str1>str2str1<str2 都返回了真;正确的写法是后面的两种,一对中括号加上转义字符或者两对中括号。

整数比较运算符

整数比较运算符用于整数测试,判断两个整数的大小关系

整数运算符说明
-eq两个数相等时返回真
-ne两个数不相等时返回真
-gt第一个数大于第二个数时返回真
-ge第一个数大于等于第二个数时返回真
-lt第一个数小于第二个数时返回真
-le第一个数小于等于第二个数时返回真
#learn_int_compare.sh
#!/bin/bash
num1=100
num2=99
[ $num1 -eq $num2 ]
echo $?
[ $num1 -ne $num2 ]
echo $?
[ $num1 -gt $num2 ]
echo $?
[ $num1 -lt $num2 ]
echo $?
num2=$num1
[ $num1 -eq $num2 ]
echo $?
[ $num1 -ne $num2 ]
echo $?
[ $num1 -ge $num2 ]
echo $?
[ $num1 -le $num2 ]
echo $?

执行结果

1
0
0
1
0
1
0
0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值