【Shell】运算符
目录
算术运算符
-
expr(求值表达式)命令
expr 是 evaluate expressions 的缩写,译为“求值表达式”。
-
expr语法
- 计算语法
expr 算术运算符表达式 注意: 运算符表达式中每个数字与符号之间要有空格 只能进行整数的运算,不能进行小数的运算
- 获取计算结果赋值给新变量语法
result=`expr 算术运算符表达式` #反引号 反引号可以执行里面的命令
- 计算语法
-
算术运算符介绍
下表列出了常用的算术运算符,假定变量 a 为 1,变量 b 为 2:
运算符 说明 举例 + 加法 expr $a + $b
结果为 3- 减法 expr $a - $b
结果为 -1* 乘法 expr $a \* $b
结果为 2/ 除法 expr $b / $a
结果为 2% 取余 expr $b % $a
结果为 0= 赋值 a=$b 将把变量 b 的值赋给 a 四则运算中如果使用了(), 也需要转义
\( 1 + 1 \)
,首个\(
和数字之间需要有空格#!/bin/bash # 使用read命令读取输入两个数字 read -p "请输入第一个数字:" read -p "请输入第二个数字:" # 对两个数字进行算数运算 echo "a=${a} b=${b}" echo "a + b = `expr $a + $b`" echo "a * b = `expr $a \* $b`" echo "a - b = `expr $a - $b`" echo "a * b = `expr $a \* $b`" echo "b / a = `expr $b / $a`" echo "b % a = `expr $b % $a`" echo "b * (a + a) = `expr $b \* \( $a + $a \)`"
比较运算符
-
整数比较运算符
[] 和 (())
- 执行方式一:单词方式
[ ]
,执行过成功中,字符与字符之间,符号与符号之间是有空格的 - 执行方式二:符号
(( ))
,不需要有空格
下表列出了常用的比较运算符,假定变量 a 为 1,变量 b 为 2:
运算符 说明 举例 -eq
equals 检测两个数是否相等,相等返回 0, 否则返回1。 [ $a -eq $b ]
返回 1。-ne
not equals检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ]
返回 0。-gt
greater than检测左边的数是否大于右边的,
是返回0, 否则1[ $a -gt $b ]
返回 1。-lt
lower than检测左边的数是否小于右边的,
是返回0, 否则1[ $a -lt $b ]
返回 0。-ge
greater equals检测左边的数是否大于等于右边的,
是返回0, 否则1[ $a -ge $b ]
返回 1。-le
lower equals检测左边的数是否小于等于右边的,
是返回0, 否则1[ $a -le $b ]
返回 0。<
检测左边的数是否小于右边的,
是返回0, 否则1(($a<$b))
返回0<=
检测左边的数是否小于等于右边的,
是返回0, 否则1(($a<=$b))
返回0>
检测左边的数是否大于右边的,
是返回0, 否则1(($a>$b))
返回1>=
检测左边的数是否大于等于右边的,
是返回0, 否则1(($a>=$b))
返回1==
检测左边的数是否等于右边的,
是返回0, 否则1(($a==$b))
返回1!=
检测左边的数是否不等于右边的,
是返回0, 否则1(($a!=$b))
返回0注意:
- 整数比较运算符只支持整数,不支持小数与字符串(字符串比较后续讲解),除非字符串的值是整数数字。
- 每个命令都有返回值, 这个后面我们会讲解退出状态再具体说明,返回0代表成功, 返回1代表失败
- 执行方式一:单词方式
-
演示
#!/bin/bash a=1 b=2 echo "a=${a} b=${b}" 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 -le $b ] then echo "$a -le $b: a 小于或等于 b" # 输出这个 else echo "$a -le $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 (($a <= $b)) then echo "$a <= $b: a 小于或等于 b" else echo "$a <= $b: a 大于 b" fi
-
字符串比较运算符
[] 和 [[]]
可以比较2个变量, 变量的类型可以为数字(整数,小数)与字符串
-
语法:
假定变量 a 为 “abc”,变量 b 为 “efg”:
运算符 说明 举例 == 或 = 相等。用于比较两个字符串或数字,相同则返回 0。可以使用 =
[ $a == $b ]
返回1[ $a = $b ]
返回 1[[ $a == $b ]]
返回1[[ $a = $b ]]
返回1!= 不相等。用于比较两个字符串或数字,不相同则返回 0。 [ $a != $b ]
返回 0[[ $a != $b ]]
返回 0< 小于, 用于比较两个字符串或数字, 小于返回0, 否则返回1 [ $a \< $b ]
返回 0[[ $a < $b ]]
返回 0> 大于, 用于比较两个字符串或数字, 大于返回0, 否则返回1 [ $a \> $b ]
返回 1[[ $a > $b ]]
返回 1-z 检测字符串长度是否为0,如果长度为0返回则返回0, 否则返回1。 [ -z $a ] 返回 false。 -n 检测字符串长度是否不为 0,如果长度不为 0 则返回0, 否则返回1。 [ -n “$a” ] 返回 true。 $ 检测字符串是否为空,为空返回0,不为空返回1 [ $a ] 返回 true。 - 字符串比较可以使用[[ ]]和[ ] 2种方式
- [] 大于号、小于号需要使用\转义,[[]]不需要转义
- 字符串比较没有 <= 可以通过 [[ "a" < "b" && "a" == "b" ]]
- 字符串比较可以使用[[ ]]和[ ] 2种方式
-
-
演示:
#!/bin/bash a="itheima" b="itcast" 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
-
[[]] (推荐) 和 [] 的区别
比较运算符有个三个:[[]]、[]、(())
- 不推荐使用(()) 原因:只能比较整数、字符串比较不了、小数也比较不了(不推荐)
-
区别2:word splitting(单词分割)的发生
-
word splitting介绍:
- 会将含有空格字符串进行分拆分割后比较
-
区别说明:
- [[]] 不会有word splitting发生
- [] 会有word splitting发生
-
-
区别2: 转义字符
- 区别说明:
-
[[]] 对 < 不需要转义, 格式为
[[ 字符串1 < 字符串2 ]]
-
[] 需要对 <,> 转义 , 格式为
[ 字符串1 \< 字符串2 ]
-
- 区别说明:
-
布尔运算符[-a、-o、!]
布尔运算符放在
[ ]
或 与test
命令配合使用才有效
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,取反, 表达式为 true 则返回 false, 否则返回 true。 | [ ! 表达式 ] 取反。 |
-o | or 或运算,有一个表达式为 true 则返回 true。 | [ 表达式1 -o 表达式2 ] |
-a | and 与运算,两个表达式都为 true 才返回 true。 | [ 表达式1 -a 表达式2 ] |
#!/bin/bash
a=1 b=2
if [ $a -lt 2 -a $b -gt 10 ]
then
echo "$a 小于 2 且 $b 大于 10 : 返回 true"
else
echo "$a 小于 2 且 $b 大于 10 : 返回 false" # $b -gt 10不成立, 输出这个表达式
fi
if [ $a -lt 10 -o $b -gt 10 ]
then
echo "$a 小于 10 或 $b 大于 10 : 返回 true" # $a -lt 10 成立, 输出这个表达式
else
echo "$a 小于 10 或 $b 大于 10 : 返回 false"
fi
if [ ! $a -gt $b ]
then
echo "$a 大于 $b 取反 : 返回 true"
else
echo "$a 大于 $b 取反 : 返回 false" # $a -gt $b 为true , 取反为false, 输出这个表达式
fi
逻辑运算符[[&&、||、!]] ((&&、||)) [!]
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ 表达式1 && 表达式2 ]] |
|| | || | |
! | 逻辑非 | [[ ! 表达式 ]] |
注意:
- 使用&& 和 || 的运算符必须放在 [[]] 或 (())中才有效, 否则报错
- ! 可以用在[],[[]]中, 不可以在(())
#!/bin/bash
a=1 b=2
if [[ $a -lt 10 && $b -gt 10 ]]
then
echo "返回 true"
else
echo "返回 false" # $b -gt 10 不成立, 输出false
fi
if [[ $a -lt 10 || $b -gt 10 ]]
then
echo "返回 true" # $a -lt 10 成立, 输出true
else
echo "返回 false"
fi
文件测试运算符
-
linux系统文件类型介绍
- -:普通文件
- d:目录文件
- l:链接文件
- b:块设备文件,比如计算机硬盘/dev/sda
- c:字符设备文件,比如计算机的USB文件/dev/usb
- p:管道文件
-
属性检测
操作符 说明 举例 -b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。 -c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。 -d file directory, 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。 -f file 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 read,检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。 -w file write,检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。 -x file execute, 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。 -s file size, 检测文件是否为空(文件大小是否大于0)
,不为空返回 true。[ -s $file ] 返回 true。 -e file exists, 检测文件(包括目录)是否存在,如果是,
则返回 true。[ -e $file ] 返回 true。 file1 -nt file2 new than(nt), file1是否比file2新 [ file1 -nt file2 ] file1 -ot file2 old than(ot), file1是否比file2旧 [ file1 -ot file2 ] -
其他检查符:
- -S: 判断某文件是否 socket。
- -L: link, 检测文件是否存在并且是一个符号链接。
-
语法:
[ options 文件路径字符串] 或 [[ options 文件路径字符串 ]]
-
演示:
#!/bin/bash file="/root/operation1.sh" # 测试文件是否可写 if [ -w $file ] then echo "文件可写" else echo "文件不可写" fi # 测试是否可读 if [ -r $file ] then echo "文件可读" else echo "文件不可读" fi # 测试是否执行 if [ -x $file ] then echo "文件可执行" else echo "文件不可执行" fi # 测试文件是什么类型的文件 if [ -f $file ] then echo "文件是普通文件" else echo "文件是特殊文件" fi # 测试文件是否为空 if [ -s $file ] then echo "文件不是空" else echo "文件是空" fi # 测试文件是否存在 if [ -e $file ] then echo "文件存在" else echo "文件不存在" fi # 测试文件是否是目录 if [ -d $file ] then echo "文件是目录" else echo "文件不是目录" fi # 判断文件的新旧 file2="/root/operation2.sh" if [ file -nt file2 ] then echo "operation1.sh文件比operation2.sh文件新" else echo "operation1.sh文件不比operation2.sh文件新" fi