Bash 支持很多运算符,包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。
9.1 算术运算符
也可以使用表达式$(( )) 或 $[]
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | $(($a + $b)) |
- | 减法 | $(($a - $b)) |
* | 乘法 | $(($a * $b)) |
/ | 除法 | $(($a / $b)) |
% | 取余 | $(($a % $b)) |
= | 赋值 | a=$b 将把变量 b 的值赋给 a。 |
#!/bin/sh a=10 b=20 val=$(($a + $b)) echo "a + b : $val" val=$(($a - $b)) echo "a - b : $val" val=$(($a * $b)) echo "a * b : $val" val=$(($a / $b)) echo "a / b : $val" val=$[$a % $b] echo "a % b : $val"
9.2 关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
说明 | 举例 | |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] |
-ne | 检测两个数是否相等,不相等返回 true。 | [ $a -ne $b ] |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] |
-ge | 检测左边的数是否大等于右边的,如果是,则返回 true。 | [ $a -ge $b ] |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] |
== | 用于比较两个数字,相同则返回 true。 | [ a == b ] |
!= | 用于比较两个数字,不相同则返回 true。 | [ a != b ] |
来看一个关系运算符的例子:
a=10 b=20 if [ $a -eq $b ] then echo "a is equal to b" else echo "a is not equal to b" fi if [ $a -ne $b ] then echo "a is not equal to b" else echo "a is equal to b" fi if [ $a -gt $b ] then echo "a is greater than b" else echo "a is not greater than b" fi if [ $a -lt $b ] then echo "a is less than b" else echo "a is not less than b" fi if [ $a -ge $b ] then echo "a is greater than or equal to b" else echo "a is not greater than or equal to b" fi if [ $a -le $b ] then echo "$a -le $b: a is less than or equal to b" else echo "$a -le $b: a is not less than or equal to b" fi
运行结果:
a is not equal to b a is not equal to b a is not greater than b a is less than b a is not greater than or equal to b a is less than or equal to b
9.3 逻辑运算符
说明 | 举例 | |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] |
-ne | 检测两个数是否相等,不相等返回 true。 | [ $a -ne $b ] |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] |
-ge | 检测左边的数是否大等于右边的,如果是,则返回 true。 | [ $a -ge $b ] |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] |
== | 用于比较两个数字,相同则返回 true。 | [ a == b ] |
!= | 用于比较两个数字,不相同则返回 true。 | [ a != b ] |
a=10 b=20 if [ ! $a -lt 100 ] then echo "! $a -lt 100 : return true" else echo "! $a -lt 100 : return false" fi if [ $a -lt 100 -a $b -gt 15 ] then echo "$a -lt 100 -a $b -gt 15 : return true" else echo "$a -lt 100 -a $b -gt 15 : return false" fi if [ $a -lt 100 -o $b -gt 100 ] then echo "$a -lt 100 -o $b -gt 100 : return true" else echo "$a -lt 100 -o $b -gt 100 : return false" fi if [ $a -lt 5 -o $b -gt 100 ] then echo "$a -lt 100 -o $b -gt 100 : return true" else echo "$a -lt 100 -o $b -gt 100 : return false" fi
运行结果:
! 10 -lt 100 : return false 10 -lt 100 -a 20 -gt 15 : return true 10 -lt 100 -o 20 -gt 100 : return true 10 -lt 5 -o 20 -gt 100 : return false
|
|
| ||
---|---|---|---|---|
运算符 | 说明 | 举例 | ||
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] | ||
!= | 检测两个字符串是否相等,不相等返回 true。 | [ $a != $b ] | ||
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] | ||
str | 检测字符串是否为空,不为空返回 true。 | [ $a ] |
a=$1 b=$2 if [ $a = $b ] then echo "a = b" else echo "a != b" fi if [ $a != $b ] then echo "a != b" else echo "a = b" fi if [ -z $a ] then echo "a length is zero" else echo "a length is not zero" fi if [ $b ] then echo "b is not empty" else echo "b is empty" fi
运行结果:
abc = efg: a is not equal to b abc != efg : a is not equal to b -z abc : string length is not zero abc : string is not empty
9.5 文件测试运算符
文件测试运算符用于检测 linux文件的各种属性。
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -b $file ] |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] |
File=$1 if [ -r $File ] then echo "$File has read permission" else echo "$File not have read permission" fi if [ -w $File ] then echo "$File has write permission" else echo "$File not have write permission" fi if [ -x $File ] then echo "$File has execute permission" else echo "$File not have execute permission" fi if [ -f $File ] then echo "$File is regular file" else echo "$File is special file" fi if [ -d $File ] then echo "$File is directory" else echo "$File is not directory" fi if [ -s $File ] then echo "$File size is not zero" else echo "$File size is zero" fi if [ -e $File ] then echo "$File exist" else echo "$File not exist" fi
运行结果:
File has read access File has write permission File has execute permission File is ordinary file This is not directory File size is zero File exists