运算符
在shell编程中的所使用的运算符与其他编程环境中采用的运算符,基本一致。主要有:算数运算符、关系运算符、布尔运算符。在shell编程中,我们大多数时间都在和Linux系统进行指令的交互,为了提高开发效率,方便开发者使用,又扩展了两类运算符类别,它们分别是:字符串运算符、文件测试运算符。下面,我们就来认识一下这些运算符,并如何使用它们!
-
算术运算符
在进行算术运算时,我们涉及到表达式的书写问题。shell中不支持原生的算术表达式书写来计算,所以它为我们提供了expr与$((表达式)) 两种方式。两者也略有不同。使用时,应该注意以下问题:
(1)在运算符的左右两边都需要空格,例如,1+1的正确写法为:expr 1 + 1或者$((1 + 1))
(2)采用expr书写的完成表达式,一般采用反引号 ` 包含起来,表示为一个表达式。例如:`expr 1 + 1`
(3)对于下面提到的乘法运算,在expr 表达式和$((表达式))是略有区别的,在expr中使用乘法则需要将乘法运算符号进行转义 (\*),例如:expr 2 \* 2
;$((表达式))则不需要转义(*),例如:$((2 * 2))
。
常见算术运算符号如下表所示,设定两个变量:a=7,b=4。运算符 描述 示例(两种写法) + 加法运算符 (1) `expr $a + $b`;(2)$(( $a + $b)), - 减法运算符 (1) `expr $a - $b`;(2)$(( $a - $b)), * 乘法运算符 (1) `expr $a \* $b`;(2)$(( $a * $b)), / 除法运算符 (1) `expr $a / $b`;(2)$(( $a / $b)), % 取余预算符 (1) `expr $a % $b`;(2)$(( $a % $b)), = 赋值运算符 a=$b,将b的值赋给a == 相等运算符,用于两数字比较,相等则返回true [ $a == $b ],结果为false。 != 不相等运算符,用于两数字比较,不相等则返回true [ $a != $b ],结果为true。 -
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。被用于比较数字之间的大于、小于、等于之间的关系。
常见的关系运算符如下表所示,设定两个变量a=10,b=8。运算符 描述 示例 -eq 等于(equal) [ $a -eq $b ],返回false -ne 不等于(not equal) [ $a -ne $b ],返回true -gt 大于(grate than) [ $a -gt $b ],返回true -lt 小于(little than) [ $a -lt $b ],返回false -ge 大于等于(great equal) [ $a -ge $b ],返回true -le 小于等于(little equal) [ $a -le $b ],返回false 注意:
此处的判断表达式“[ 表达式 ]”内部两侧必须有空格。
-
布尔运算符
布尔运算符用在布尔表达式中,进行特定的逻辑运算。
常见的布尔预算符如下表所示,定义两个变量:a=10,b=20。运算符 描述 用例 ! 非运算(not)(可看做为取反) [ ! false ],返回true -o(||) 或运算,(or) [ $a -ne $b -o $a -gt $b ],返回true -a (&&) 与运算(and) [ $a -eq $b -o $a -lt $b ],返回false 这里需要注意的是,在多判断表达式中使用或运算和与运算的时候,
1)对于或运算只要第一个表达式为true,即为true,不做后续判断;2)对于或运算只要第一个表达式为false,即为false,不做后续判断;
-
字符串运算符
在shell编程中,很多情况下在使用字符串前,我们需要进行一些简单的判断操作。为了方便开发,因此就诞生了有关字符串的运算符。
常见的字符串运算符下表所示,定义两个变量a=“qwe”,b=“sdf”。运算符 描述 示例 = 比较两个字符串是否相等 [ $a = $b ],返回false != 比较两个字符串是否不相等 [ $a != $b ],返回true -z 检测字符串长度是否为0(zero) [ -z $b ],返回false -n 检测字符串长度是否不为0(不为null) [ -n $a ],返回true $ 检测字符串是否为空,不为空返回true [ $a ],返回true 对表中的 $ 运算,就想我们 $a 返回的是 a 的具体数值,
有数据返回即为true,无数据返回即为false
。所谓判断条件基本也是这样处理的。 -
文件测试运算符
学习过Linux的我们,应该都知道,在Linux的世界里一切皆文件,包括硬件设备信息等都是文件以文件的形式存在于Linux系统中。所以呢,在进行Shell编程的时候,就自然诞生了有关文件的运算符号,方便我们对文件的操作。
常用的文件测试运算符如下表所示。定义文件变量:file="/home/mongo/test.sh",大小为100字节,具有rwx权限。运算符 描述 示例 -b 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。 -c 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。 -d 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。 -f 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。 -g 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。 -k 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。 -p 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。 -u 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。 -r 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。 -w 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。 -x 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。 -s 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。 -e 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。 附加测试符号:
- -S: 判断某文件是否 socket。
- -L: 检测文件是否存在并且是一个符号链接。
记录学习,记录成长!如果有帮到您,还请动动您的小手给个赞喏~~~