一、Shell 基本运算符
Shell 和其他编程语言一样,支持多种运算符,包括:
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
二、算术运算符
1、+ 、-、*、 /、 加减乘除
2、% 取余
3、= 赋值
4、== 判断是否相等。用于比较两个数字,相同则返回 true。
5、!= 判断不相等。用于比较两个数字,不相同则返回 true。
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
#!/bin/bash
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
输出:
[root@liang shell]# ./shell01.sh
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b
注意: 乘号(*)前边必须加反斜杠()才能实现乘法运算;
三、关系运算符
- -eq:检测两个数是否相等,相等返回 true。
- -ne:检测两个数是否不相等,不相等返回 true。
- -gt:检测左边的数是否大于右边的,如果是,则返回 true。
- -lt:检测左边的数是否小于右边的,如果是,则返回 true。
- -ge:检测左边的数是否大于等于右边的,如果是,则返回 true。
- -le:检测左边的数是否小于等于右边的,如果是,则返回 true。
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : true"
else
echo "$a -eq $b: false"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b : true"
else
echo "$a -ne $b : false"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: true"
else
echo "$a -gt $b: false"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: true"
else
echo "$a -lt $b: false"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: true"
else
echo "$a -ge $b: false"
fi
if [ $a -le $b ]
then
echo "$a -le $b: true"
else
echo "$a -le $b: false"
fi
输出结果:
[root@liang shell]# ./shell01.sh
[root@liang shell]# ./shell01.sh
10 -eq 20: false
10 -ne 20: true
10 -gt 20: false
10 -lt 20: true
10 -ge 20: false
10 -le 20: true
四、布尔运算符
- !:非运算,表达式为 true 则返回 false,否则返回 true。
- -o:或运算,或运算,有一个表达式为 true 则返回 true。
- -a:与运算,与运算,两个表达式都为 true 才返回 true。
a=10
b=20
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a 小于 100 且 $b 大于 15 : true"
else
echo "$a 小于 100 且 $b 大于 15 : false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a 小于 100 或 $b 大于 100 : true"
else
echo "$a 小于 100 或 $b 大于 100 : false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
echo "$a 小于 5 或 $b 大于 100 : true"
else
echo "$a 小于 5 或 $b 大于 100 : false"
fi
输出内容:
[root@liang shell]# ./shell01.sh
10 != 20 : a 不等于 b
10 小于 100 且 20 大于 15 : true
10 小于 100 或 20 大于 100 : true
10 小于 5 或 20 大于 100 : false
五、逻辑运算符
&&:and
||:or
基本用法:与布尔运算符的 -a 和 -o类似
#!/bin/bash
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "$a -lt 100 并且 $b -gt 100 : true"
else
echo "$a -lt 100 并且 $b -gt 100 : false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "$a -lt 100 或者 $b -gt 100 :true"
else
echo "$a -lt 100 或者 $b -gt 100 :false"
fi
输出:
[root@liang shell]# ./shell01.sh
10 -lt 100 并且 20 -gt 100 : false
10 -lt 100 或者 20 -gt 100 :true
特殊用法:[ 条件 ] && echo "true" || echo "false":条件成立打印true,否则打印false
#!/bin/bash
a=10
b=20
[ $a -gt $b ] && echo "a大于b" || echo 'a小于b'
[ $b -gt $a ] && echo "b大于a" || echo 'b小于a'
输出:
[root@liang shell]# ./shell01.sh
a小于b
b大于a
六、字符串运算符
- =:检测两个字符串是否相等,相等返回 true。
- !=:检测两个字符串是否相等,不相等返回 true。
- -z:字符串长度是否为 0,为 0 则 true
- -n:字符串长度是否不为 0,不为 0 返回 true
- $:字符串是否为空,不为空返回 true
#!/bin/bash
a="abc"
b="def"
if [ $a = $b ]
then
echo "$a = $b : true"
else
echo "$a = $b: false"
fi
if [ $a != $b ]
then
echo "$a != $b : true"
else
echo "$a != $b: false"
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
输出内容:
[root@liang shell]# ./shell01.sh
abc = def: false
abc != def : true
-z abc : 字符串长度不为 0
-n abc : 字符串长度不为 0
abc : 字符串不为空
七、文件表达式
- -f:检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
- -d:检测文件是否是目录,如果是,则返回 true。
- -x:检测文件是否可执行,如果是,则返回 true。
- -r:检测文件是否可读,如果是,则返回 true。
- -w:检测文件是否可写,如果是,则返回 true。
- -e:检测文件(包括目录)是否存在,如果是,则返回 true。
- -s:检测文件是否为空(文件大小是否大于0),不为空返回 true。
#!/bin/bash
file='text0003.sh'
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在,新建"
touch $file
fi
if [ -s $file ]
then
echo '文件不为空'
else
echo '文件为空,写入内容'
echo "this is my fist add" >> $file
fi
[ -s $file ] && echo '文件不为空' || echo '文件为空'
if [ -r $file ]
then
echo '文件可读'
else
echo '文件不可读'
fi
if [ -w $file ]
then
echo '文件可写'
else
echo '文件不可写'
fi
if [ -x $file ]
then
echo '文件可执行'
else
echo '文件不可执行,增加可执行权限'
chmod +x $file
fi
[ -x $file ] && echo '文件可执行' || echo '文件不可执行'
输出:
[root@liang shell]# ./shell01.sh
文件不存在,新建
文件为空,写入内容
文件不为空
文件可读
文件可写
文件不可执行,增加可执行权限
文件可执行
小练习
编写如下shell程序
- a.输入4个大于0小于等于20的数字,统计它们的和、最小的数字和最大的数字
- b.要求有异常数字校验功能
#!/bin/bash
checkInt()
{
expr $1 "+" 10 &> /dev/null
[ $? -ne 0 ] && { echo "参数$1不是数字!";exit 1; }
}
if [ "$#" -ne 4 ];then
echo "参数个数有误"
exit 1
fi
max=$1
min=$1
for i in "$@"
do
checkInt $i
if [ $i -le 0 ];then
echo "输入的参$i数必须大于0"
exit 0
elif [ $i -gt 20 ];then
echo "输入的参数$i必须小于等于20"
exit 1
fi
if [ $max -lt $i ];then
max=$i
fi
if [ $min -gt $i ];then
min=$i
fi
let sum+=$i
done
echo "最大值为$max"
echo "最小值为$min"
echo "和为$sum"
执行
[root@liang shell]# ./test.sh 0 12 5 i
输入的参0数必须大于0
[root@liang shell]# ./test.sh 10 12 5 i
参数i不是数字!
[root@liang shell]# ./test.sh 10 12 5 20
最大值为20
最大值为5
和为47