Shell脚本入门 04:算术与逻辑运算

Posted Naisu Xu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本入门 04:算术与逻辑运算相关的知识,希望对你有一定的参考价值。

目的

基础铺垫

操作符/命令

在Shell中如果要对变量等进行运算很多时候都需要有相应的操作符或者命令支持下才能进行,下面是一些常用的操作符及命令,其中加粗部分更加常用些,下面文章中也将以加粗部分进行介绍:

操作符/命令说明
(( ))用于整数运算
let用于整数运算
$[]用于整数运算
declare -i将变量设置为整数类型,这样就就可以直接运算了
expr可用于整数运算,也可以处理字符串
bc任意精度计算器语言,可以满足常见的所有数学计算
test 和 [ ]检查文件类型和比较值
[[ ]]检查文件类型和比较值

运算符

在操作符/命令下变量等就可以使用运算符进行运算了,下面是一些常用的运算符:

运算符说明
+、-、*、/、%加、减、乘、除、取余
=、+=、-=、*=、/=、%=运算并赋值
**幂运算
++、–自增、自减
<<、>>向左移位、向右移位
&、|、^、~按位与、按位或、按位异或、按位取反
==、!=相等、不等
<、<=、>、>=小于、小于等于、大于、大于等于
&&、||、!逻辑与、逻辑或、逻辑非(取反)

if else 语句

逻辑运算通常结合选择语句(比如 if else 语句)使用,这里简单介绍下 if else 语句的语法:

if  condition
then
    statement1
else
    statement2
fi

condition 是判断条件,如果 condition 成立(返回“真”),那么 then 中的语句将会被执行;如果 condition 不成立(返回“假”),那么 else 后边的语句将会被执行( else 及其中内容也可不写),最后以 fi 结束。上面语句也可以写成下面形式:

if  condition;  then
    statement1
else
    statement2
fi

if else 语句支持多分支:

if condition1; then
   statement1
elif condition2; then
    statement2
elif condition3; then
    statement3
……
else
   statementn
fi

常用操作符/命令使用

(())

(()) 主要用于整数运算,其内部使用变量时不需要加 $ ,可以在 (()) 前面加 $ 来获取其操作结果:

(()) 中可以有多个表达式,之间用 , 分隔;对于多个表达式的,以最后一个作为其操作结果:

(()) 也可以出现逻辑运算:

bc

bc 是Linxu中一个 任意精度计算器语言(命令),可以用来进行各种数学计算,支持变量、函数、循环、选择等语法。 bc 可以直接在终端中使用,也可以在Shell中使用。在终端中输入 bc 即可进入使用,输入 quit 可以退出:

bc 有一些内置的特殊变量:

特殊变量说明
scale小数点位数,默认为0
ibase输入的数字的进制,默认为10
obase输入的数字的进制,默认为10
last最后一次计算的值,也可以用 . 来表示

bc 内置一些数学计算函数,使用时需要启用 -l 来支持(启用后 scale 会被设置成20):

函数说明
s(x)x的正弦值,x以弧度为单位
c(x)x的余弦值,x以弧度为单位
a(x)x的反正切值,返回弧度值
l(x)x的自然对数
e(x)e的x次方
j(n,x)贝塞尔函数,计算从n到x的阶数

bc 更多内容可以使用 man bc 进行查看。

在Shell脚本中使用 bc 命令可以使用管道命令或是重定向等方式将计算过程传递给它;一行中如果有多条语句可以使用 ; 进行分隔;如果有多条计算语句,那么会分别输出结果:

test 和 [ ]

test 命令用来检查某个条件是否成立,可以对表达式、字符串、整数、文件进行检查。

test 命令语法为 test expression ,也可以简写为 [ expression ] (注意方括号和其中内容间需要空格):

test 命令使用时通常搭配选项或是运算符一同进行,主要的搭配如下,说明中的条件成立为真:

表达式判断:

选项或运算说明
! EXPRESSION逻辑非,对结果取反
EXPRESSION1 -a EXPRESSION2逻辑与,两个表达式均成立才为真
EXPRESSION1 -o EXPRESSION2逻辑与,有一个表达式成立则为真

字符串判断(使用字符串变量时最好用引号包围,防止空字符串时出现异常):

选项或运算说明
-n STRING字符串非空
-z STRING字符串为空
STRING1 = STRING2字符串相等
STRING1 != STRING2字符串不等

整数判断:

选项或运算说明
INTEGER1 -eq INTEGER2数值相等
INTEGER1 -ge INTEGER2INTEGER1大于等于INTEGER2
INTEGER1 -gt INTEGER2INTEGER1大于INTEGER2
INTEGER1 -le INTEGER2INTEGER1小于等于INTEGER2
INTEGER1 -lt INTEGER2INTEGER1小于INTEGER2
INTEGER1 -ne INTEGER2数值不相等

文件判断:

选项或运算说明
FILE1 -ef FILE2文件拥有相同的device和inode编号
FILE1 -nt FILE2FILE1的修改时间比FILE2新
FILE1 -ot FILE2FILE1比FILE2旧
-e FILE文件存在
-s FILE文件存在并且非空
-r FILE文件存在并且有读取权限
-w FILE文件存在并且有写入权限
-x FILE文件存在并且有执行权限
-b FILE文件存在并且是块特殊文件
-c FILE文件存在并且是字符特殊文件
-d FILE文件存在并且是目录文件
-f FILE文件存在并且是常规文件
-h FILE文件存在并且是符号链接文件
-L FILE文件存在并且是符号链接文件
-p FILE文件存在并且是管道文件
-S FILE文件存在并且是套字节文件
-g FILE文件存在并且有SGID权限
-u FILE文件存在并且有SUID权限
-k FILE文件存在并且有SBIT权限
-G FILE文件存在并且由EGID拥有
-O FILE文件存在并且由EUID拥有
-t FD文件描述符已被终端打开

[[ ]]

[[ ]]test[ ] 的一种进阶的操作符,他的语法是 [[ expression ]]

[[ ]] 相比较而言使用时更加方便些:不需要担心空字符串;可以直接使用逻辑运算符连接多条语句比如 [[ expr1 && expr2 ]] 或者 [[ expr1 || expr2 ]] ;支持正则表达式,语法为 [[ str =~ regex ]]

总结

Shell脚本编写中基本上整数的运算与判断使用 (()) ,小数的运算使用 bc ,其他的逻辑判断等使用 [[ ]] 。基本上这三种方式就能覆盖大多数时候了。需要注意的是这些方式有的是Linux提供的,有的是特定Shell提供的,有可能在特定的平台中无法使用,这个时候就需要借助其它方式了。

以上是关于Shell脚本入门 04:算术与逻辑运算的主要内容,如果未能解决你的问题,请参考以下文章

Shell 脚本入门--下

13种Shell逻辑与算术,能写出5种算你赢!

13种Shell逻辑与算术,能写出5种算你赢!

第五课-第四讲05_04_bash脚本编程之三 条件判断及算术运算

Shell编程入门

第04章 运算符