shell运算符
shell支持的运算符有:
- 算数运算符
- 整数比较运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
算术运算符
shell有4种方式可实现整数算术运算: expr命令, (()), [], let命令
下表列出了常用的算术运算符,假定变量 x 为 7,变量 y 为 3:
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $x + $y 结果为 10 |
- | 减法 | $[$x - $y] 结果为4 |
\* | 乘法 | expr $x \* $y 结果为 21, *符号需用\转义 |
/ | 除法 | expr $x / $y 结果为 2。 |
% | 取余 | $(($x % $y)) 结果为 1。 |
示例代码:
#!/bin/bash
x=7
y=3
val=`expr $x + $y`
echo "x + y : $val"
val=`expr $x - $y`
echo "x - y : $val"
val=`expr $x \* $y`
echo "x * y : $val"
val=`expr $x / $y`
echo "x / y : $val"
val=`expr $x % $y`
echo "x % y : $val"
输出结果如下:
x + y : 10
x - y : 4
x * y : 21
x / y : 2
x % y : 1
整数比较运算符
比较运行符也叫关系运算符,shell中只支持数字的关系运算不支持字符串,除非字符串的值是数字,设x=1,y=2
运算符 | 说明 | 举例 |
---|---|---|
-eq 或 == | 等于 | [ $x -eq $y ] 返回 false |
-ne 或 != | 不等于 | [ $x -ne $y ] 返回true |
-gt | 大于,左边数是否大于右边 | [ $x -gt $y ] 返回 false |
-ge | 大于或等于 | [ $x -ge y$b ] 返回 false |
-lt | 小于,如果是左边数是否小于右边 | [ $x -lt $y ] 返回 true。 |
-le | 小于或等于 | [ $x -le $y ] 返回 true。 |
< | 小于 | (($x<$y)) |
<= | 小于或等于 | (($x<=$y)) |
> | 大于 | (($x>$y)) |
>= | 大于或等于 | (($x>=$y)) |
表达式中方括号、运算符和变量之间都有必须空格分开
#!/bin/bash
x=5
y=8
if [ $x eq $y ]
then
echo "x等于y"
else
echo "x不等于y"
fi
if [ $x != $y ]
then
echo "x真的不等于y"
else
echo "x真的等于y"
fi
if [ $x -gt $y ]
then
echo "x大于y"
else
echo "x小于y"
fi
输出结果:
x不等于y
x真的不等于y
x小于y
布尔运算符
布尔运算符说明,设x=10,y=20
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算 | [ ! false ] 返回true |
-o | 或运算 or,两个表达式其中一个为true,则返回true | [ $x -lt 13 -o $y -gt 23 ] 返回 true。 |
-a | 与运算 and,两个表达式都为true则返回true | [ $x -lt 13 -a $y -gt 13 ] 返true。 |
布尔运算只能放在中括号:[] 内或 test指令后才有效
逻辑运算符
以下介绍 Shell 的逻辑运算符,假定变量 x=10, y =20:
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ $x -lt 100 && $y -gt 100 ]] 返回 false |
|| | 逻辑的 or | [[ $x -lt 100 && $y -gt 100 ]] 返回 true |
逻辑运算必须放在
[[]]
或(())
中才有效! 可以用在
[]
,[[]]
中, 不可以在(())
示例:
x=10
y=20
echo "有x=${x},y=${y}"
if [[ $x -lt 100 && $y -gt 100 ]]
then
echo "x<100 且 y>100 成立"
else
echo "x<100 且 y>100 不成立"
fi
if [ $x -lt 100 -o $y -gt 100 ]
then
echo "x<100 或者 y>100 成立"
else
echo "x<100 或者 y>100 不成立"
fi
if [[ $x < $y ]]
then
echo "[[x<y]] 成立"
fi
if [ $x != $y ]
then
echo "[x!=y] 成立"
fi
输出结果:
x不等于y
x真的不等于y
x小于y
有x=10,y=20
x<100 且 y>100 不成立
x<100 或者 y>100 成立
[[x<y]] 成立
[x!=y] 成立
字符串运算符
下表列出了常用的字符串运算符,假定变量 x为 "abc",变量 y 为 "efg":
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true | [ $x = $y ] 返回 false |
!= | 检测两个字符串是否不相等,不相等返回 true | [ $x != $y ] 返回 true |
-z | 检测字符串长度是否为0,为0返回 true | [ -z $x ] 返回 false |
-n | 检测字符串长度是否不为 0,不为 0 返回 true。 | [ -n "$x" ] 返回 true |
$ | 检测字符串是否不为空,不为空返回 true | [ $x ] 返回 true |
示例:
#!/bin/bash
a="welcome" b="wenesday " c=1 d=2 #初始变量赋值
echo "a=${a},b=${b},c=${c},d=${d}"
if [ $a = $b ]
then
echo "$a = $b : a 等于 b"
else
echo "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a != $b: a 等于 b"
fi
if [[ $a > $b ]]
then
echo "$a > $b : a 大于 b"
else
echo "$a > $b: a 不大于 b"
fi
if [ $a \> $b ]
then
echo "$a > $b : a 大于 b"
else
echo "$a > $b: a 不大于 b"
fi
if [[ $c > $d ]]
then
echo "$c > $d : c 大于 d"
else
echo "$c > $d: c 不大于 d"
fi
if [ -z $a ]
then
echo "-z $a : 字符串长度为 0"
else
echo "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ]
then
echo "-n $a : 字符串长度不为 0"
else
echo "-n $a : 字符串长度为 0"
fi
if [ $a ]
then
echo "$a : 字符串不为空"
else
echo "$a : 字符串为空"
fi
文件测试运算符
文件测试运算符用于检测文件的各种属性
常用文件测试运算符列表:
操作符 | 说明 |
---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true |
-d file | 检测文件是否是目录,如果是,则返回 true。 [ -d filename ] |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件) |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true |
-k file | 检测该文件是否存在,并且是否拥有 SBIT 权限 |
-p file | 检测文件是否是命名管道,如果是,则返回 true |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true |
-r file | 检测文件是否可读,如果是,则返回true |
-w file | 检测文件是否可写,如果是,则返回 true |
-x file | 检测文件是否可执行,如果是,则返回 true |
-s file | 检测文件是否存在,且大小为非空 |
-S file | 检测文件是否是套接字文件。 |
-L file | 检测文件是否存在并且是一个符号链接文件。 |
示例:
#!/bin/bash
file="/home/a.sh"
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi
if [ -d $file ]
then
echo "文件是个目录"
else
echo "文件${file}不是目录"
fi
if [ -r $file ]
then
echo "文件${file}可读"
else
echo "文件不可读"
fi
if [ -w $file ]
then
echo "文件${file}可写"
else
echo "文件不可写"
fi
if [ -x $file ]
then
echo "文件可执行"
else
echo "文件不可执行"
fi
if [ -f $file ]
then
echo "文件为${file}普通文件"
else
echo "文件为特殊文件"
fi
if [ -s $file ]
then
echo "文件${file}不为空"
else
echo "文件为空"
fi