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 INTEGER2 | INTEGER1大于等于INTEGER2 |
INTEGER1 -gt INTEGER2 | INTEGER1大于INTEGER2 |
INTEGER1 -le INTEGER2 | INTEGER1小于等于INTEGER2 |
INTEGER1 -lt INTEGER2 | INTEGER1小于INTEGER2 |
INTEGER1 -ne INTEGER2 | 数值不相等 |
文件判断:
选项或运算 | 说明 |
---|---|
FILE1 -ef FILE2 | 文件拥有相同的device和inode编号 |
FILE1 -nt FILE2 | FILE1的修改时间比FILE2新 |
FILE1 -ot FILE2 | FILE1比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:算术与逻辑运算的主要内容,如果未能解决你的问题,请参考以下文章