shell编程和其他编程语言一样,支持多种运算符,包括:关系运算符、算数运算符、布尔运算符、字符串运算符、文件测试运算符。我们依次来学习一下它们:
算数运算符
在平常的编程语言里面,直接用加减乘除就可以运算,但在shell编程中,原生bash不支持简单的数学运算,我们需要借助其他的命令来实现。
比如我们用expr实现,可以在man手册里查看expr的具体用法:
[root@localhost ~]# expr 2 + 24
[root@localhost ~]# expr 2 - 20
[root@localhost ~]# expr 2 * 2
expr: syntax error
[root@localhost ~]# expr 2 \* 24
[root@localhost ~]# expr 2 / 21
注意:1、运算符号两边是有空格的
2、在使用乘法的时候,*有语义冲突,所以我们用转义符“\”转义之后才能运算。
关系运算符
下面给大家列出来一些常用的关系运算符:
-eq | 检测两个数是否相等,相等返回 true。 |
-ne | 检测两个数是否不相等,不相等返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 |
用脚本实现一下:
以下用方括号的地方可以用test来代替(test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试)
比如:if test $[a] -eq $[b] 括号里可以进行基本的算数运算,不需要空格。
#!/bin/bash
a=10 b=20
if [ $a -eq $b ];then #方括号里面的而表达式两边都有空格
echo "$a -eq $b :a等于b"
else
echo "$a -eq $b :a不等于b"
fi
if [ $a -ne $b ];then
echo "$a -ne $b :a不等于b"
else
echo "$a -ne $b :a等于b"
fi
if [ $a -gt $b ];then
echo "$a -gt $b :a大于b"
else
echo "$a -gt $b :a不大于b"
fi
if [ $a -lt $b ];then
echo "$a -lt $b :a小于b"
else
echo "$a -lt $b :a不小于b"
fi
if [ $a -ge $b ];then
echo "$a -ge $b :a大于等于b"
else
echo "$a -ge $b :a小于或等于b"
fi
if [ $a -eq $b ];then
echo "$a -le $b :a小于等于b"
else
echo "$a -le $b :a大于等于b"
fi
运行结果为:
10 -eq 20 :a不等于b
10 -ne 20 :a不等于b
10 -gt 20 :a不大于b
10 -lt 20 :a小于b
10 -ge 20 :a小于或等于b
10 -le 20 :a大于等于b
布尔运算符
常用的布尔运算符有:与(-a)、或(-o)、非(!)
脚本里的内容为:
#!/bin/bash
a=10 b=20 c=5 d=100
if [ $a != $b ];then
echo "$a != $b :a不等于b"
else
echo "$a != $b :a等于b"
fi
if [ $a -lt $b -a $d -gt $c ];then
echo "$a -lt $b :a小于b且d大于c:返回true"
else
echo "$a -lt $b :a小于b且d大于c:返回false"
fi
if [ $a -ge $c -o $c -ge $d ];then
echo "$a -le $b :a大于等于c或c大于等于d:返回true"
else
echo "$a -le $b :a大于等于c或c大于等于d:返回false"
fi
运行结果为:
10 != 20 :a不等于b
10 -lt 20 :a小于b且d大于c:返回true
10 -le 20 :a大于等于c或c大于等于d:返回true
逻辑运算符
shell中的逻辑运算符有&&(逻辑的AND)和||(逻辑得到OR)
脚本为:
#!/bin/bash
a=10 b=20
if [[ $a -lt 100 && $b -gt 100 ]] #注意是双方括号哦
then
echo "返回 true"
else
echo "返回 false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
运行结果为:
返回 false
返回 true
字符串运算符
下面有一些常用的字符串运算符,实现方法跟上面的例子一样:
例如:a="huahua",b="shihuaa"
运算符 | 举例 | 结果 |
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否为0,不为0返回 true。 | [ -n "$a" ] 返回 true。 |
str | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
文件测试运算符
文件测试运算符用于检测文件的各种属性,属性检测描述如下:
操作符 | 说明 | 举例 |
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
脚本的实现方法也和上面的类似。