Linux Shell中的基本运算符

Shell支持各种运算符。本章我们现在将讨论以下运算符:

  • 算术运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试操作符

Bash Shell没有任何执行简单算术运算的机制,但它可以使用外部程序,awkexpr进行算术运算。

以下示例显示如何将两个数字相加

#!/bin/bash

VAL=`expr 2 + 2`
echo "sum : $VAL"

上述脚本将输出以下结果:

sum : 4

相加时需要考虑以下几点:

  • 运算符和表达式之间必须有空格。 例如,2+2是不正确的; 它应该写成2 + 2
  • 完整的表达式应包含在``(反引号)之间。

算术运算符

Bash Shell 支持以下算术运算符。

假设变量a的值为10,变量b20,则

运算符 描述 示例
+(加法) 将运算符的两侧数值相加 expr $a + $b将得到30
-(减法) 从左边操作数中减去右边操作数 expr $a - $b将得到-10
*(乘法) 将运算符两边的值相乘 expr $a \* $b将得到200
/(除法) 将左边操作数除以右边操作数 expr $b / $a 将得到 2
%(取模) 将左边操作数除以右边操作数并返回余数 expr $b % $a 将给出 0
=(赋值) 将右操作数的值赋给左操作数 a = $b 会将b的值赋给a
==(相等) 比较两个数字,如果两者相同则返回true[ $a == $b ] 将返回false
!=(不等) 比较两个数字,如果两者不同则返回true[ $a != $b ] 将返回true

所有条件表达式都应该在方括号内,并且它们周围要有空格,这非常重要,例如 [ $a == $b ] 是正确的,而[$a==$b]是不正确的。

所有算术计算都是使用长整型数值完成的。

关系运算符

Bash Shell支持以下特定于数值的关系运算符。 这些运算符不适用于字符串值,除非它们的值是数字。

例如,以下运算符将用于检查1020之间以及“10”和“20”之间的关系,但不会检查“十”和“二十”之间的关系。

假设变量a10,变量b20,则:

运算符 描述 示例
-eq 检查两个操作数的值是否相等;如果是,则为true [ $a -eq $b ]结果为true
-ne 检查两个操作数的值是否相等;如果值不相等,则为true [ $a -ne $b ]结果为true
-gt 检查左操作数的值是否大于右操作数的值; 如果是,则结果为真。 [ $a -gt $b ]结果为true
-lt 检查左操作数的值是否小于右操作数的值; 如果是,则结果为真。 [ $a -lt $b ]结果为true
-ge 检查左操作数的值是否大于或等于右操作数的值; 如果是,则结果为真。 [ $a -ge $b ]结果为true
-le 检查左操作数的值是否小于或等于右操作数的值; 如果是,则结果为真。 [ $a -le $b ]结果为true

所有条件表达式都应该放在方括号内并在它们周围有空格是非常重要的。 例如, [ $a <= $b ]是正确的,而[$a <= $b]是不正确的。

布尔运算符

Bash Shell支持以下布尔运算符。

假设变量a10,变量b20,则

运算符 描述 示例
! 逻辑否定。将真转换为假,反之亦然。 [ ! false ]的结果为true
-o 逻辑或。如果操作数之一为真,则结果为真。 [ $a -lt 20 -o $b -gt 100 ]的结果为true
-a 这是逻辑与。如果两个操作数都为真,则结果为真,否则为假。 [ $a -lt 20 -a $b -gt 100 ]的结果为true

字符串运算符

Bash Shell 支持以下字符串运算符。假设变量a的值为“abc”,变量b的值为“efg”,那么:

运算符 描述 示例
= 检查两个操作数的值是否相等; 如果是,则结果为真。 [ $a = $b ]的结果为false
!= 检查两个操作数的值是否相等; 如果值不相等,则结果为真。 [ $a != $b ]的结果为true
-z 检查给定的字符串操作数长度是否为零; 如果长度为零,则返回true [ -z $a ]的结果为false
-n 检查给定的字符串操作数长度是否为非零; 如果它是非零长度,则返回true [ -n $a ]的结果为true
str 检查str是否不是空字符串; 如果为空,则返回false [ $a ]的结果为true

文件测试操作符

我们有一些运算符可用于测试与Linux文件相关的各种属性。

假设一个变量指向一个现有的文件名“test”的文件,它的大小为100字节,并且具有读、写和执行权限

运算符 描述 示例
-b file 检查文件是否为块特殊文件; 如果是,则结果为真。 [ -b $file ]的结果为false
-c file 检查文件是否为字符特殊文件; 如果是,则结果为真。 [ -c $file ]的结果为false
-d file 检查文件是否为目录; 如果是,则结果为真。 [ -d $file ]的结果为false
-f file 检查文件是否是普通文件,而不是目录或特殊文件; 如果是,则结果为真。 [ -f $file ]的结果为true
-g file 检查文件是否设置了组ID (SGID) 位; 如果是,则结果为真。 [ -g $file ]的结果为false
-k file 检查文件是否设置了S位; 如果是,则结果为真。 [ -k $file ]的结果为false
-p file 检查文件是否为命名管道;如果是,则结果为真。 [ -p $file ]的结果为false
-t file 检查文件描述符是否打开并与终端关联; 如果是,则结果为真。 [ -t $file ]的结果为false
-u file 检查文件是否设置了设置用户ID (SUID) 位; 如果是,则结果为真。 [ -u $file ]的结果为false
-r file 检查文件是否可读; 如果是,则结果为真。 [ -r $file ]的结果为true
-w file 检查文件是否可写; 如果是,则结果为真。 [ -w $file ]的结果为true
-x file 检查文件是否可执行; 如果是,则结果为真。 [ -x $file ]的结果为true
-s file 检查文件的大小是否大于0; 如果是,则结果为真。 [ -s $file ]的结果为true
-e file 检查文件是否存在; 即使file是一个目录但存在,也是如此。 [ -e $file ]的结果为true