本文讲解shell编程中变量的数值计算。
1.常见的算术运算符:
提示:
此处对于我自己来说++、--比较难理解,之前一看到脚本中有这些符号,就看不懂了,所以在此举例说明一下:
[[email protected] ~]# a=10 ==>定义变量a
[[email protected] ~]# echo $((a++))
==>如果a在运算符++或--的前面,那么输出整个表达式时,会输出a的值, 此前定义的变量a为10,所以此处的值为10.
10
[[email protected] ~]# echo $a ==>执行上述表达式后,因为有a++,因此a会自增1,所以输出的值为11
11
[[email protected] ~]# a=11 ==>定义变量a
[[email protected] ~]# echo $((a--))
==>如果a在运算符++或--的前面,那么输出整个表达式时,会输出a的值,前定义的a为11,所以此处的值为11.
11
[[email protected] ~]# echo $a ==>执行上述表达式后,因为有a--,因此a会自减1,所以输出的值为10
10
[[email protected] ~]# a=10
[[email protected] ~]# echo $((--a))
==>如果a在运算符++或--的后面,那么输出整个表达式时,先进行自增或自减计算,因为a为10, 且要自减,所以表达式的值为9.
9
[[email protected] ~]# echo $a ==>执行上述表达式后,a自减1,所以表达式的值为9.
9
[[email protected] ~]# echo $((++a))
==>如果a在运算符++或--的后面,那么输出整个表达式时,先进行自增或自减计算,因为a为9,且要自增1,所以表达式的值为10
10
[[email protected] ~]# echo $a ==>执行上述表达式后,a自增1,所以表达式的值为10
10
总结:
执行echo $((a++))和echo $((a--))命令输出整个表达式时,输出的值为a的值,表达式执行完毕后,会对a进行++、--的运算,而执行
echo $((++a))和echo $(--a)命令输出整个表达式时,会先对a进行++、--的运算,然后再输出表达式的值,即为a运算后的值。
记忆口诀:
变量a在运算符之前,输出表达式的值为a,然后a自增或自减;
变量a在运算符之后,输出的表达式会先进行自增或自减,表达式的值就是自增或自减后a的值。
常见的算术运算命令:
(1)双小括号"(())"数值运算命令
双小括号"(())"数值运算的基础语法
双小括号"(())"的作用是进行数值运算与数值比较,效率很高,用法灵活,是企业场景运维人员经常采用的运算操作符。
操作方法见下表:
提示:
(())进行比较操作时,如果"echo $((2>1))"返回结果为1则表示真,如果返回结果为0,则表示假。
“(())”表达式在命令行执行时不需要加$符号,直接使用((2+3))形式即可,但是如果需要输出,就要加$
符号,如:echo $((2+3))。
"(())"里的所有的字符之间没有空格,有一个或多个空格都不会影响结果。
(2)let运算命令的用法
let运算命令的语法格式:let 赋值表达式
let赋值表达式的功能等同于“((赋值表达式))”
let赋值:举例:let i=i+2 ==>等同于((i=i+2))
(3)expr命令的用法
expr命令的基本用法:
expr既可以用于整数运算,也可以用于相关字符串长度、匹配等的运算处理。
应用1:expr用于计算
语法:expr Expression ==>expression中可包含变量
例如:
[[email protected] ~]# expr 1 + 1
2
[[email protected] ~]# expr 1 \* 1
1
注意:在使用expr时,要注意以下2点:
- 运算符及用于计算的数字左右都至少有一个空格,否则会报错。
- 使用乘号时,必须用反斜线进行转义。
应用2:判断一个变量值或字符串是否为整数
此应用利用以expr做计算时变量或字符创必须为整数的规则,把一个变量或字符串和一个已知的整数(非0)相加,
看返回的值是否为0,如果为0,就认为做加法的变量或字符串为整数,否则就不是整数。
另外,expr match功能也可以进行整数判断,格式如下:
expr match $string substring
在$string字符串中匹配substring字符串,然后返回匹配到的substring字符串的长度,若找不到,则返回0。
应用3:expr判断文件扩展名是否符合要求:
举例说明:
判断是否是以.pub为扩展名:
[[email protected] scripts]# cat expr.sh
#!/bin/sh
if expr "$1" : ".*\.pub" &>/dev/null ==>注意:在此冒号前后要有空格
then
echo "you are using $1"
else
echo "pls use *.pub file"
fi
[[email protected] scripts]# sh expr.sh qq.pub
you are using qq.pub
[[email protected] scripts]# sh expr.sh qq
pls use *.pub file
应用4:通过expr计算字符串的长度
语法:expr length $变量名或字符串
(4)bc命令的用法
bc是Linux下的计算器,当然除了作为计算器使用,还可以作为命令行计算工具使用。
使用方法如下:
[[email protected] scripts]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty‘.
2+3
5
3*3
9
[[email protected] scripts]# echo 2+3|bc
5
[[email protected] scripts]# echo "scale=2;9/2" | bc ==>使用scale=2保留2位小数
4.50
[[email protected] scripts]# echo "scale=2;355/113" | bc
3.14
(5)awk实现计算
利用awk运算的效果也很好,适合小数和整数,尤其是小数,运算很精确。
示例如下:
[[email protected] ~]# echo "5 6" | awk ‘{print ($1+$2)}‘
==>$1为第1个数字,$2为第2个数字,用空格分开 ,注意awk ‘{ }‘的单引号
11
[[email protected] ~]# echo "5.5 6.6" | awk ‘{print ($1+$2)}‘
12.1
(6)declare(同typeset)命令的语法
declare与typeset命令是bash的内置命令,二者命令的语法相同,用来声明shell变量,设置变量的属性。
常用命令参数:
- -r:设置变量为只读
- -i:设置变量为整数
- -a:设置变量为数组array
- -f:如果后面没有参数的话,会列出之前脚本定义的所有函数,如果有参数的话,列出以参数命名的函数
- -x:设置变量在脚本外也可以使用
简单使用如下:
[[email protected] ~]# declare -i A=1 B=2
[[email protected] ~]# A=A+B
[[email protected] ~]# echo $A
3
(7)$[ ]符号的运算示例
[[email protected] ~]# echo $[1+2]
3
[[email protected] ~]# echo $[1*2]
2
(8)基于shell变量输入read命令的运算实践
shell脚本除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入中获得,read为bash的
内置命令,而已通过help read查看帮助。
语法格式:read [参数] [变量名]
常用参数:
-p(prompt):设置提示信息
-t(timeout):设置输入等待时间,单位默认为秒。
[[email protected] ~]# read -t 5 -p "Pls input one num:" num
==>此处的num为变量名,注意此处不需要加$符号,下面a、b同理。
Pls input one num:2
[[email protected] ~]# read -t 5 -p "Pls input two num:" a b
Pls input two num:1 2
以上为本人在读《跟老男孩学Linux运维之shell编程实战》这本书时的笔记,如有任何版权问题,请联系留言。