写点什么

Shell 语法之基本运算符

作者:向阳逐梦
  • 2023-05-08
    四川
  • 本文字数:2462 字

    阅读完需:约 8 分钟

Shell语法之基本运算符

Shell 和其他编程语言一样,支持多种运算符,包括:

  • 算数运算符

  • 关系运算符

  • 布尔运算符

  • 字符串运算符

  • 文件测试运算符

原生 bash 不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):

#!/bin/bash
val=`expr 2 + 2`echo "两数之和为 : $val"
复制代码


两点注意:

  • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。

    完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

一、算术运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]

实例

算术运算符实例如下:

a=10b=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"fiif [ $a != $b ]then echo "a 不等于 b"fi
复制代码

执行脚本,输出结果如下所示:

a + b : 30a - b : -10a * b : 200b / a : 2b % a : 0a 不等于 b
复制代码

注意:


  • 乘号(*)前边必须加反斜杠(\)才能实现乘法运算;

  • if...then...fi 是条件语句,后续将会讲解。

  • 在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 "\" 。

二、关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

实例

关系运算符实例如下:

a=10b=20
if [ $a -eq $b ]then echo "$a -eq $b : a 等于 b"else echo "$a -eq $b: a 不等于 b"fiif [ $a -ne $b ]then echo "$a -ne $b: a 不等于 b"else echo "$a -ne $b : a 等于 b"fiif [ $a -gt $b ]then echo "$a -gt $b: a 大于 b"else echo "$a -gt $b: a 不大于 b"fiif [ $a -lt $b ]then echo "$a -lt $b: a 小于 b"else echo "$a -lt $b: a 不小于 b"fiif [ $a -ge $b ]then echo "$a -ge $b: a 大于或等于 b"else echo "$a -ge $b: a 小于 b"fiif [ $a -le $b ]then echo "$a -le $b: a 小于或等于 b"else echo "$a -le $b: a 大于 b"fi
复制代码

执行脚本,输出结果如下所示:

10 -eq 20: a 不等于 b10 -ne 20: a 不等于 b10 -gt 20: a 不大于 b10 -lt 20: a 小于 b10 -ge 20: a 小于 b10 -le 20: a 小于或等于 b
复制代码

三、布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

实例

布尔运算符实例如下:

a=10b=20
if [ $a != $b ]then echo "$a != $b : a 不等于 b"else echo "$a == $b: a 等于 b"fiif [ $a -lt 100 -a $b -gt 15 ]then echo "$a 小于 100 且 $b 大于 15 : 返回 true"else echo "$a 小于 100 且 $b 大于 15 : 返回 false"fiif [ $a -lt 100 -o $b -gt 100 ]then echo "$a 小于 100 或 $b 大于 100 : 返回 true"else echo "$a 小于 100 或 $b 大于 100 : 返回 false"fiif [ $a -lt 5 -o $b -gt 100 ]then echo "$a 小于 5 或 $b 大于 100 : 返回 true"else echo "$a 小于 5 或 $b 大于 100 : 返回 false"fi
复制代码

执行脚本,输出结果如下所示:

10 != 20 : a 不等于 b10 小于 100 且 20 大于 15 : 返回 true10 小于 100 或 20 大于 100 : 返回 true10 小于 5 或 20 大于 100 : 返回 false
复制代码

四、逻辑运算符

以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

实例

逻辑运算符实例如下:

a=10b=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
复制代码

执行脚本,输出结果如下所示:

返回 false返回 true
复制代码

五、字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":

实例

字符串运算符实例如下:

a="abc"b="efg"
if [ $a = $b ]then echo "$a = $b : a 等于 b"else echo "$a = $b: a 不等于 b"fiif [ $a != $b ]then echo "$a != $b : a 不等于 b"else echo "$a != $b: a 等于 b"fiif [ -z $a ]then echo "-z $a : 字符串长度为 0"else echo "-z $a : 字符串长度不为 0"fiif [ -n "$a" ]then echo "-n $a : 字符串长度不为 0"else echo "-n $a : 字符串长度为 0"fiif [ $a ]then echo "$a : 字符串不为空"else echo "$
复制代码

执行脚本,输出结果如下所示:

abc = efg: a 不等于 babc != efg : a 不等于 b-z abc : 字符串长度不为 0-n abc : 字符串长度不为 0abc : 字符串不为空
复制代码

六、文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

属性检测描述如下:

其他检查符:


  • -S: 判断某文件是否 socket。

  • -L: 检测文件是否存在并且是一个符号链接。

实例

变量 file 表示文件 /var/www/runoob/test.sh,它的大小为 100 字节,具有 rwx 权限。下面的代码,将检测该文件的各种属性:

file="/var/www/runoob/test.sh"if [ -r $file ]then   echo "文件可读"else   echo "文件不可读"fiif [ -w $file ]then   echo "文件可写"else   echo "文件不可写"fiif [ -x $file ]then   echo "文件可执行"else   echo "文件不可执行"fiif [ -f $file ]then   echo "文件为普通文件"else   echo "文件为特殊文件"fiif [ -d $file ]then   echo "文件是个目录"else   echo "文件不是个目录"fiif [ -s $file ]then   echo "文件不为空"else   echo "文件为空"fiif [ -e $file ]then   echo "文件存在"else   echo "文件不存在"fi
复制代码

执行脚本,输出结果如下所示:

文件可读文件可写文件可执行文件为普通文件文件不是个目录文件不为空文件存在
复制代码


发布于: 刚刚阅读数: 4
用户头像

向阳逐梦

关注

人生享受编程,编程造就人生! 2022-06-01 加入

某公司芯片测试工程师,嵌入式开发工程师,InfoQ签约作者,阿里云星级博主,华为云·云享专家。座右铭:向着太阳,追逐梦想!

评论

发布
暂无评论
Shell语法之基本运算符_Shell_向阳逐梦_InfoQ写作社区