一、变量数值计算的命令
变量的数值计算主要有以下几个命令或者符号:
- (())
- let
- expr
- bc
- $[]
二、(())
(一)运算符表
运算符 | 说明 |
++ -- | 增加 减少,可前置也可后置 |
+ - !~ | 一元正号 负号 逻辑与位的取反 |
+ - * / % | 加法、减法、乘法、除法、取余 |
< <= > >= | 比较符号 |
== != | 相等与不相等 |
<< >> | 向左位移 向右位移 |
& | 位的AND |
^ | 位的异或 |
| | 位的或 |
&& | 逻辑AND |
|| | 逻辑OR |
?: | 条件表达式 |
= += -= *= /= %= &= ^= <<= >>= |= |
赋值运算符 x+=1,相当于x = x+1 |
上述的运算符常常置于$((...))语法中,如下的实例说明。
[root@localhost ~]# ((a=1+2+3)) [root@localhost ~]# echo $a 6 [root@localhost ~]# b=$((3**3)) [root@localhost ~]# echo $b 27 [root@localhost ~]# echo $((5%2)) 1
上述三种不同的写法,值得注意的是(())涉及的变量均是整型的计算,不可用于浮点型和字符型。
(二)实例
1、++ --变量前后
[root@localhost ~]# x=1 [root@localhost ~]# echo $((x++)) 1 [root@localhost ~]# echo $x 2 [root@localhost ~]# x=1 [root@localhost ~]# echo $((++x)) 2 [root@localhost ~]# echo $x 2
变量在前,先输出变量的值;变量在后,先运算后再输出变量的值。
2、各种运算符计算
[root@localhost ~]# echo $((100%10)) 0 [root@localhost ~]# echo $((100**10)) 7766279631452241920 [root@localhost ~]# echo $((100/10)) 10 ...
3、计算器
实现通过传参的形式进行加、减、乘、除的计算器功能。
#!/bin/sh echo "$(($1$2$3))"
通过sh test.sh 1+2进行计算。这是通过传入三个参数,另外也可以将三个参数当成一个:
#!/bin/sh echo "$(($1))"
二、let命令
let命令是进行赋值表达式:let 赋值表达式
# 使用let [root@localhost project]# a=1 [root@localhost project]# let a=a+2 [root@localhost project]# echo $a 3 #不使用let [root@localhost project]# a=a+2 [root@localhost project]# echo $a a+2
let a=a+2等同于((a=a+2)),但后者效率更高。
三、expr
expr命令可用于整型和字符串,用来求表达式的值,同时expr是一个手工命令行计算器。
1、运算
[root@localhost project]# expr 2 + 1 3 [root@localhost project]# expr 2 - 1 1 # 使用进行转义 [root@localhost project]# expr 2 * 1 2 [root@localhost project]# expr 2 / 1 2
- 运算符左右都有空格,并且左右两侧的空格数量一致
- 乘除等运算符号需要使用来进行转义
2、循环计数
[root@localhost project]# i=0 [root@localhost project]# i=`expr $i + 1` [root@localhost project]# echo $i 1
四、bc
bc是unix下的计算器,可用在命令行下面:
[root@localhost project]# 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'. 1+1 2
它不仅可用于整型的计算,还可用于浮点型的计算:
[root@localhost project]# echo 1+1|bc 2 [root@localhost project]# echo 1+1.5|bc 2.5 [root@localhost project]# echo 1*1.5|bc 1.5
使用bc完成1-20的整数相加:
#法一 [root@localhost project]# echo "`seq -s + 20`="`seq -s + 20|bc` 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20=210 #法二 [root@localhost project]# echo "`seq -s + 20`="$((`seq -s + 20`)) 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20=210
五、$[]
[root@localhost project]# echo $[2+2] 4 [root@localhost project]# echo $[ 2+2 ] 4 [root@localhost project]# echo $[ 2*2 ] 4
它可以用来代替expr,并且不需要运算符两侧的空格。
六、变量输入
shell变量除了可以直接赋值和脚本传参外,还可以使用read命令从标准输入获取数值。
语法格式:read 参数 变量名
参数:
- -p(prompt)设置提示信息
- -t(timeout)设置等待时间,单位秒
# 变量x前有空格 [root@localhost project]# read -p "please input:" x y please input:1 2 [root@localhost project]# echo $x $y 1 2
read可以代替用户传参:
#!/bin/sh read -t 20 -p "please input three param:" a b c echo "$(($a$b$c))"
上面脚本执行后:
[root@localhost project]# sh test.sh please input three param:1 + 2 3
另外read -p功能可以使用echo和read替代:
[root@localhost project]# echo -n "please input:" please input:[root@localhost project]# read x y