Shell 根基运算符

Shell 和其余编程说话一样,撑持多种运算符,包罗:

  • 算数运算符
  • 干系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

原生bash不撑持简略的数学运算,可是能够经由过程其余号令来完成,比方 awk 和 expr,expr 最经常利用。

expr 是一款抒发式计较东西,利用它能完成抒发式的求值操纵。

比方,两个数相加(注重利用的是反引号 ` 而不是单引号 '):

实例

#!/bin/bash

val=`expr 2 + 2`
echo "两数之和为 : $val"

运转实例 »

履行剧本,输入成果以下所示:

两数之和为 : 4

两点注重:

  • 抒发式和运算符之间要有空格,比方 2+2 是毛病的,必须写成 2 + 2,这与咱们熟习的大大都编程说话不一样。
  • 完全的抒发式要被 ` ` 包罗,注重这个字符不是经常利用的单引号,在 Esc 键下边。

算术运算符

下表列出了经常利用的算术运算符,假设变量 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。
== 相称。用于比拟两个数字,不异则前往 true。 $a == $b 前往 false。
!= 不相称。用于比拟两个数字,不不异则前往 true。 $a != $b 前往 true。

注重:前提抒发式要放在方括号之间,并且要有空格,比方: $a==$b 是毛病的,必须写成 $a == $b

实例

算术运算符实比方下:

实例

#!/bin/bash
# author:【WEB手艺大学】教程
# url:xfitphysio.com

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"

if $a == $b
then
   echo "a 即是 b"
fi
if $a != $b
then
   echo "a 不即是 b"
fi

履行剧本,输入成果以下所示:

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不即是 b

注重:

  • 乘号(*)前边必须加反斜杠(\)能力完成乘法运算;
  • if...then...fi 是前提语句,后续将会讲授。
  • 在 MAC 中 shell 的 expr 语法是:$((抒发式)),此处抒发式中的 "*" 不须要本义标记 "\" 。

干系运算符

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

下表列出了经常利用的干系运算符,假设变量 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。

实例

干系运算符实比方下:

实例


#!/bin/bash
# author:【WEB手艺大学】教程
# url:xfitphysio.com

a=10
b=20

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

履行剧本,输入成果以下所示:

10 -eq 20: a 不即是 b
10 -ne 20: a 不即是 b
10 -gt 20: a 不大于 b
10 -lt 20: a 小于 b
10 -ge 20: a 小于 b
10 -le 20: a 小于或即是 b

布尔运算符

下表列出了经常利用的布尔运算符,假设变量 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。

实例

布尔运算符实比方下:

实例

#!/bin/bash
# author:【WEB手艺大学】教程
# url:xfitphysio.com

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

履行剧本,输入成果以下所示:

10 != 20 : a 不即是 b
10 小于 100 且 20 大于 15 : 前往 true
10 小于 100 或 20 大于 100 : 前往 true
10 小于 5 或 20 大于 100 : 前往 false

逻辑运算符

以下先容 Shell 的逻辑运算符,假设变量 a 为 10,变量 b 为 20:

运算符 申明 举例
&& 逻辑的 AND $a -lt 100 && $b -gt 100 前往 false
|| 逻辑的 OR $a -lt 100 || $b -gt 100 前往 true

实例

逻辑运算符实比方下:

实例


#!/bin/bash
# author:【WEB手艺大学】教程
# url:xfitphysio.com

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

履行剧本,输入成果以下所示:

前往 false
前往 true

字符串运算符

下表列出了经常利用的字符串运算符,假设变量 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。

实例

字符串运算符实比方下:

实例


#!/bin/bash
# author:【WEB手艺大学】教程
# url:xfitphysio.com

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

履行剧本,输入成果以下所示:

abc = efg: a 不即是 b
abc != efg : a 不即是 b
-z abc : 字符串长度不为 0
-n abc : 字符串长度不为 0
abc : 字符串不为空

文件测试运算符

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

属性检测描写以下:

操纵符 申明 举例
-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: 判定某文件是不是 socket。
  • -L: 检测文件是不是存在并且是一个标记链接。

实例

变量 file 表现文件 /var/www/jishudaxue/test.sh,它的巨细为 100 字节,具备 rwx 权限。上面的代码,将检测该文件的各类属性:

实例

#!/bin/bash
# author:【WEB手艺大学】教程
# url:xfitphysio.com

file="/var/www/jishudaxue/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

履行剧本,输入成果以下所示:

文件可读
文件可写
文件可履行
文件为通俗文件
文件不是个目次
文件不为空
文件存在