今天我们继续学习shell编程语言的内容
四、Shell脚本语言的运算
4.1 算数运算
shell支持算术运算,但只支持整数,不支持小数
4.2 Bash中的算术运算
-- + 加法运算 -- - 减法运算 -- * 乘法运算 -- / 除法运算 -- % 取模,即取余数 -- ** 乘方 #乘法符号在有些场景需要转义
4.2 实现算术运算
1. let var=算术表达式
2. var=$[算术表达式]
3. var=$((算术表达式))
4. var=$(expr arg1 arg2 arg3 ...)
5. declare -i var = 数值
6. echo '算术表达式' | bc (支持浮点数)
4.3 增强型赋值:
+= i+=10 <==> i=1+10 -= i-=j <==> i=i-j *= /= %= ++ i++,++i <==> i=i+1 (自增) -- i--,--i <==> i=i-1 (自减)
实例:
[root@localhost ~]# let var+=1
[root@localhost ~]# echo $var
1
[root@localhost ~]# let var++
[root@localhost ~]# echo $var
2
[root@localhost ~]# let var-=1
[root@localhost ~]# echo $var
1
[root@localhost ~]# let var--
[root@localhost ~]# echo $var
0
# i++ 与 ++i的区别:
i++ 先赋值再运算
++i 先运算再赋值
[root@localhost ~]# unset i j ;i=1;let j=i++;echo "i=$i,j=$j"
i=2,j=1
[root@localhost ~]# unset i j ;i=1;let j=++i;echo "i=$i,j=$j"
i=2,j=2
[root@localhost ~]#
实例:鸡兔同笼问题
(1)
[root@localhost ~]# vim xiaojiji.sh
#!/bin/bash
HEAD=35
FOOT=94RABBIT=$(((FOOT-HEAD-HEAD)/2))
CHICKEN=$[35-RABBIT]
echo "兔子的数量为:"$RABBIT
echo "鸡的数量为:"$CHICKEN
[root@localhost ~]# chmod +x xiaojiji.sh
[root@localhost ~]# ./xiaojiji.sh
兔子的数量为:12
鸡的数量为:23
(2)在脚本中写入变量,让用户在命令行写入需要计算的数值
[root@localhost ~]# vim xiaojiji.sh
#!/bin/bash
HEAD=$1
FOOT=$2RABBIT=$(((FOOT-HEAD-HEAD)/2))
CHICKEN=$[35-RABBIT]
echo "兔子的数量为:"$RABBIT
echo "鸡的数量为:"$CHICKEN
[root@localhost ~]# ./xiaojiji.sh 30 80
兔子的数量为:10
鸡的数量为:25
4.2 逻辑运算(了解,不用掌握)
True用数字表示1,False用数字表示0
与:&
1 与 1 = 1 1 与 0 = 0 0 与 1 = 0 0 与 0 = 0
或:|
1 或 1 = 1 1 或 0 = 1 0 或 1 = 1 0 或 0 = 0
非:!
!1 = 0 !True=False !0 = 1 !False=True
异或:^
#异或的两个值,相同为假,不同为真 1 ^ 1 =0 1 ^ 0 =1 0 ^ 1 =1 0 ^ 0 =0
4.4 条件测试命令
条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成测试过程,实现评估布尔声明,以便在条件性环境下进行执行。
若真,则状态码变量$?返回0
若假,则状态码变量$?返回1
扩展: [ ] 与 [[ ]] 的区别
`区别1: [ ]是符合POSIX标准的测试语句,兼容性强,几乎可以运行在所有的Shell解释器中 [[ ]]仅可运行在特定的几个Shell解释器中(如Bash) `区别2: > < 可以在[[ ]]中使用ASCII码顺序进行排序,而[]不支持 `区别3: 在[ ]中使用-a 和 -o 表示逻辑与和逻辑或,[[ ]]使用&& 和 || 表示,[[ ]]不支持-a `区别4: 在[ ]中==是字符匹配,在[[ ]]中==是模式匹配 `区别5: [ ]不支持正则匹配,[[ ]]支持用=~进行正则匹配 `区别6: [ ]仅在部分Shell中支持用()进行分组,[[ ]]均支持 `区别7: 在[ ]中如果变量没有定义,那么需要用双引号引起来,在[[ ]]中不需要
4.4.1 条件测试命令及其语法
[<测试表达式>] 说明:该方法和test命令的用法一样,[]的两边和内容之间至少有一个空格
[[ <测试表达式> ]] 说明:比test和[]更新的语法格式。[[]]的边界和内容之间至少有一个空格。[[]]中可以使用通配符等进行模式匹配
[root@localhost ~]# [ 1 > 2 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ 1 > 2 ]]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [[ 1 >= 2 ]]
-bash: 条件表达式中有语法错误
[root@localhost ~]# [[ 1 = 2 ]]
-bash: 未预期的记号 "1" 附近有语法错误
[root@localhost ~]# [[ "hello" =~ "h" ]]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ "hello" =~ "p" ]]
[root@localhost ~]# echo $?
1