【Linux Shell】5. 运算符

文章目录

  • [【 1. 算术运算符 】](#【 1. 算术运算符 】)
    • [1.1 expr 命令](#1.1 expr 命令)
    • [1.2 方括号](#1.2 [ ] 方括号)
  • [【 2. 关系运算符 】](#【 2. 关系运算符 】)
  • [【 3. 布尔运算符 】](#【 3. 布尔运算符 】)
  • [【 4. 逻辑运算符 】](#【 4. 逻辑运算符 】)
  • [【 5. 字符串运算符 】](#【 5. 字符串运算符 】)
  • [【 6. 文件测试运算符 】](#【 6. 文件测试运算符 】)

【 1. 算术运算符 】

运算符 说明 举例
= 赋值 a=$b 把变量 b 的值赋给 a。

1.1 expr 命令

  • 原生 bash 不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用(expr 是一款表达式计算工具,使用它能完成表达式的求值操作)。
  • 完整的 expr 表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在键盘上的 Esc 键下边。
  • 表达式和运算符之间要有空格,例如2+2是不对的,必须写成2 + 2,这与我们熟悉的大多数编程语言不一样。
  • 下表列出了常用的算术运算符, 乘号 * 前边必须加 反斜杠 \ 才能实现乘法运算 。假定变量 a 为 10,变量 b 为 20:
运算符 说明 举例
+ 加法 `expr a + b` 结果为 30。
- 减法 `expr a - b` 结果为 -10。
* 乘法 `expr a \\\* b` 结果为 200。
/ 除法 `expr b / a` 结果为 2。
% 取余 `expr b % a` 结果为 0。
= 赋值 a=$b 把变量 b 的值赋给 a。
  • 实例
bash 复制代码
#!/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"

1.2 方括号

  • \[\] 可以执行基本的算数运算。
  • 实例:实现两数相加。
bash 复制代码
#!/bin/bash

a=5
b=6

result=$[a+b] # 注意等号两边不能有空格
echo "result 为: $result"

【 2. 关系运算符 】

  • 关系运算符只支持数字,不支持字符串,除非字符串的值是数字。 条件表达式要放在方括号之间,并且要有空格 ,例如: a = = a== a==b 是错误的,必须写成 $a == $b
  • 常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
关系 运算符 等价运算符 作用 举例
-eq == 检测两个数是否相等,相等返回 true。 $a -eq $b 返回 false。
-ne != 检测两个数是否不相等,不相等返回 true。 $a -ne $b 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 $a -gt $b 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 $a -lt $b 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 $a -ge $b 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 $a -le $b 返回 true。
  • 实例1:传统比较命令。
bash 复制代码
#!/bin/bash

a=10
b=20

# 1.等于
if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi
if [ $a == $b ]
then
   echo "$a == $b : a 等于 b"
else
   echo "$a == $b: a 不等于 b"
fi

# 2. 不等于
if [ $a -ne $b ]
then
   echo "$a -ne $b: a 不等于 b"
else
   echo "$a -ne $b : a 等于 b"
fi
if [ $a != $b ]
then
   echo "$a != $b: a 不等于 b"
else
   echo "$a != $b : a 等于 b"
fi

# 3. 大于
if [ $a -gt $b ]
then
   echo "$a -gt $b: a 大于 b"
else
   echo "$a -gt $b: a 不大于 b"
fi

# 4. 小于
if [ $a -lt $b ]
then
   echo "$a -lt $b: a 小于 b"
else
   echo "$a -lt $b: a 不小于 b"

# 5. 大于等于
if [ $a -ge $b ]
then
   echo "$a -ge $b: a 大于或等于 b"
else
   echo "$a -ge $b: a 小于 b"
fi

# 6. 小于等于
if [ $a -le $b ]
then
   echo "$a -le $b: a 小于或等于 b"
else
   echo "$a -le $b: a 大于 b"
fi
bash 复制代码
#!/bin/bash

num1=100
num2=100
if test $[num1] -eq $[num2]
then
	echo '两个数相等!'
else
	echo '两个数不相等!'
fi
  • 实例3:使用 ((...)) 作为判断语句判断两个变量的大小。
bash 复制代码
#!/bin/bash

a=10
b=20
if (( $a == $b ))
then
   echo "a 等于 b"
elif (( $a > $b ))
then
   echo "a 大于 b"
elif (( $a < $b ))
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi

【 3. 布尔运算符 】

  • 常用的布尔运算符,假定变量 a 为 10,变量 b 为 20。
布尔 运算符 作用 举例
! 非运算,表达式为 true 则返回 false,否则返回 true。 ! false 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 $a -lt 20 -o $b -gt 100 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 $a -lt 20 -a $b -gt 100 返回 false。
  • 实例
bash 复制代码
#!/bin/bash

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

【 4. 逻辑运算符 】

  • 逻辑运算符,假定变量 a 为 10,变量 b 为 20。
逻辑 运算符 作用 举例
&& 逻辑的 AND \[ $a -lt 100 \&\& $b -gt 100 ] 返回 false。
|| 逻辑的 OR \[ $a -lt 100 || $b -gt 100 ] 返回 true。
  • 实例
bash 复制代码
#!/bin/bash

a=10
b=20

if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

【 5. 字符串运算符 】

  • 常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg"。
字符串 运算符 作用 举例
= 检测两个字符串是否相等,相等返回 true。 $a = $b 返回 false。
!= 检测两个字符串是否不相等,不相等返回 true。 $a != $b 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 -z $a 返回 false。
-n 检测字符串长度是否不为 0,不为 0 返回 true。 -n "$a" 返回 true。
$ 检测字符串是否不为空,不为空返回 true。 $a 返回 true。
  • 实例
bash 复制代码
#!/bin/bash

a="abc"
b="efg"

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 [ -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

【 6. 文件测试运算符 】

  • 文件测试运算符用于检测文件的各种属性。
字符串 运算符 作用 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 -b $file 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 -c $file 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 -d $file 返回 false。
-f 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 检测文件是否可读,如果是,则返回 true。 -r $file 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 -w $file 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 -x $file 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 -s $file 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 -e $file 返回 true。
-S file 判断某文件是否 socket。
-L file 检测文件是否存在并且是一个符号链接。
  • 实例
    变量 file 表示文件 /home/sunday/test.sh,它具有 rwx 权限。下面的代码,将检测该文件的各种属性:
bash 复制代码
#!/bin/bash

file="/home/sunday/test.sh"
if [ -r $file ]
then
   echo "文件可读"
else
   echo "文件不可读"
fi
if [ -w $file ]
then
   echo "文件可写"
else
   echo "文件不可写"
fi
if [ -x $file ]
then
   echo "文件可执行"
else
   echo "文件不可执行"
fi
if [ -f $file ]
then
   echo "文件为普通文件"
else
   echo "文件为特殊文件"
fi
if [ -d $file ]
then
   echo "文件是个目录"
else
   echo "文件不是个目录"
fi
if [ -s $file ]
then
   echo "文件不为空"
else
   echo "文件为空"
fi
if [ -e $file ]
then
   echo "文件存在"
else
   echo "文件不存在"
fi
相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5203 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩3 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言