Shell运算符
Bash 支持很多运算符,包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。
9.1 算术运算符
- 也可以使用表达式$(( )) 或 $[]
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | |
- | 减法 | |
* | 乘法 | |
/ | 除法 | |
% | 取余 | |
= | 赋值 | 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 ] |
注意:条件表达式要放在方括号之间,并且要有空格,例如 [expression] 是错误的,必须写成 [ expression ]。
来看一个关系运算符的例子:
#!/bin/sh
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 ] |
#!/bin/bash
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
9.4 字符串运算符
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] |
!= | 检测两个字符串是否相等,不相等返回 true。 | [ $a != $b ] |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] |
str | 检测字符串是否为空,不为空返回 true。 | [ $a ] |
看一个例子:
#!/bin/bash
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 ] |
例如,下面的代码,将检测该文件的各种属性:
#!/bin/bash
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