(四)Shell编程之算数运算

一、shell算数运算表达式

shell允许计算算数表达式,但是不能直接使用,需要使用算数展开 $(( exoression )),或者使用((符合命令、let或declare的-i选项。))计算是在固定宽度的整数中进行的,不检查溢出,尽管被0除会被捕捉并标记为错误

二、算数运算符

shell中常见的算数运算符如下:

算数/逻辑/比较运算符说明/含义
+、-                加法(或正号)、减法(或负号)
*、/、%惩罚、除法、取余(取模)
**幂运算
++、--自增和自减
!、&&、||逻辑非(取反)、逻辑与(and)、逻辑或(or)
<、<=、>、>=比较符号(小于、小于等于、大于、大于等于)
==、!=、=比较符号(相等、不相等;对于字符串,=可以表示相等于)
<<、>>向左移位、向右移位
~、|、&、^        

按位取反、按位或、按位与、按位异或

=、+=、-=、*=、/=、%=赋值运算符,例如 a+=1相当于a=a+1,a-=1相当于a=a-1

Shell变量允许作为操作数;在计算表达式之前执行参数展开。在表达式中,shell变量也可以通过名称引用,二不适用参数展开语法(可以不带$符号,但是不推荐)。当不使用参数展开语法而按名称引用为空或未设置的shell变量时,其计算结果为0.当一个变量被引用时,它的值将被作为一个算数表达式计算,或者当一个变量使用“declare -i”被赋值给一个整数属性时,它的值将被赋值。空值的计算结果为0.

三、算数运算命令

Bash shell在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,他们也会被视为字符串,这一点和大部分的编程语言不同。要想让数字计算发挥作用,必须使用数学计算命令。Shell中常用的数学计算命令如下表所示。

运算操作符/运算命令说明
(())用于整数运算,效率很高,推荐使用
let用于整数运算,和(())类似
$[]用于整数运算,不如(())灵活
expr可用于整数运算,也可以处理字符串。比较麻烦,需要注意各种细节,不推荐使用
bcLinux下的一个计算器程序,可以处理整数和小数。Shell本身值支持整数运算,想计算小数就得使用bc这个外部的计算器。
declare -i将变量定义为整数,然后在进行数学运算时就不会被当成字符串了。功能有限,仅支持最基本的数学运算(加减乘除和取余),不支持逻辑运算、自增自减,所以在实际开发者很少使用。

(1)(( ))

(( expression )) 

计算算数表达式,如果表达式的值非零,则返回状态为0;否则返回状态为1.完全等价于 let "expression"

# 整数运算
((1+1))

# echo $? 上一条语句的结果
echo $?


# 执行结果为0,因为1+1不等于0,所以 ((1+1))这条语句的返回状态为0
0


表达式也可以有多个,有多个表达式时用逗号隔开 ((exp1,exp2))当执行多个表达式时,根据最后一个表达式的值来判断(())命令的执行状态。


可以使用 $ 来获取 (()) 执行的算数表达式的结果:

# 查看1+1等于几
echo $((1+1))
# 查看2的三次方等于几
echo $((2**3))


# 执行结果
2
8


也可以用比较运算符:

# 比较运算符
a=1
b=2
echo $((a<b))
echo $((a>b))

# 执行结果
# 布尔值true返回1,false返回0
1
0


也可以这么玩,类似于三元表达式:a<b成立则执行a++否则执行b++

# a<b成立则执行a++否则执行b++
a=1
b=2
((a<b?a++:b++)) 


# 执行结果
2
2

 (2)let

let内建函数允许对shell变量执行算数运算。如果最后一个表达式的计算结果为0,let返回1;否则返回0。

命令格式如下:

let expression [expression ...]

(()) 不同的是,let 使用空格来分隔多个表达式。并且对于 x+y 这样的表达式,let 只会计算但不会保存结果,可以通过 let var=x+y 的方式将 x+y 的结果保存到变量 var 中。

后面的不常用,大家就自行扩展叭~ 

四、条件结构

shell中也有流程控制条件分支语句,格式与python有点类似。

语法如下:

(1)if-then-fi(单分支)

(2)if-then-else-fi(二分支)

(3)if-then-elif-else-fi(多分支)

五、条件运算 

在shell中可以通过 test,或者 [[]] 关键字来检查某个条件是否成立。通常与if语句一起使用。

test命令有很多选项,可以进行数值、字符串和文件三个方面的检测。

Shell test 命令的格式为:

test expression

当test判断expression成立时,退出状态为0,否则为1。

test命令也可以简写为 [],它的格式为:

[ expression ]

注意 [] expression之间的空格,这两个空格是必须的,否则会导致语法错误。 []的写法更加简洁,比 test 使用频率高。

test 和 []是等价的。

使用 test命令进行数值比较的案例:

六、文件检测选项

(1)文件类型的判断

我们演示一个,其他的就不演示啦~ 

(2)文件权限的判断

(3)文件比较

(4)数值比较


 

(5)字符串比较

  我们举个栗子,其他的童鞋们自己去练练哈。

 

TODO:在Shell中,他们只能用来比较字符串,不能比较数字,有C语言,Python、Java等变成经验的小伙伴们要注意了!!! 

(6)逻辑运算

 

七、在test中使用变量建议用双引号包围起来

test 和 [ ] 都是命令,一个命令本质上对应一个程序或者一个函数。即使是一个程序,它也有入口函数,例如C语言程序的入口函数是main(),运行C语言程序就从main()函数开始,所以也可以将一个程序等效为一个函数,这样我们就不用再区分函数和程序了,直接将一个命令和一个函数对应起来即可。

有了以上认知,就很容易看透命令的本质了:使用一个命令其实就是调用一个函数,命令后面附带的选项和参数最终都会作为实参传递给函数。

假设test命令对应的函数是func(),使用 test -z $str1 命令时,会先将变量 $str1 替换成字符串:

 

 

  

 

 

 

 

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值