Shell之变量的数值计算与输入

一、变量数值计算的命令

变量的数值计算主要有以下几个命令或者符号:

  • (())
  • 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
作者:iveBoy
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/shenjianping/p/14288329.html