shell中常见的运算命令
运算操作符与运算命令 | 意义 |
---|---|
(()) | 用于整数运算的常用运算符,效率很高 |
let | 用于整数运算,类似 (()) |
expr | 可用于整数运算,单还有其他额外功能 |
bc | Linux下的一个计算程序,(适合整数及小数运算) |
$[] | 用于整数运算 |
awk | awk既可以用于整数运算,可以用于小数运算 |
declare | 定义变量值和属性,-i参数可以用于定义整形变量,做运算 |
1. (()) 数值运算命令
1.1 ((i=i+1)) 运算后赋值
这个中方式只能用于赋值运算,不能输出结果,如果要计算后输出结果需要使用 $((i=i+1))
# 错误的写法
[root@ 192.168.1.24 ~]$echo ((i=i+10))
-bash: syntax error near unexpected token `('
# 正确的写法
[root@ 192.168.1.24 ~]$i=10
[root@ 192.168.1.24 ~]$((i=i+10))
[root@ 192.168.1.24 ~]$echo $i
20
[root@ 192.168.1.24 ~]$j=$((i+10))
[root@ 192.168.1.24 ~]$echo $j
30
综合示例
[root@ 192.168.1.24 ~]$cat cal.sh
# 位置参数1
a=$1
# 位置参数2
b=$2
echo a=$a
echo b=$b
echo $a-$b=$((a-b))
echo $a+$b=$((a+b))
echo $a*$b=$((a*b))
echo $a/$b=$((a/b))
echo $a%$b=$((a%b))
echo $a%7=$((a%7))
echo $a**$b=$((a**b))
[root@ 192.168.1.24 ~]$sh cal.sh 10 20
a=10
b=20
10-20=-10
10+20=30
10*20=200
10/20=0
10%20=10
10%7=3
10**20=7766279631452241920
[root@ 192.168.1.24 ~]$
2. (())用于逻辑判断,用于条件判断
[root@ 192.168.1.24 ~]$((8>7 && 5==5))
[root@ 192.168.1.24 ~]$echo $?
0
[root@ 192.168.1.24 ~]$((8<7 && 5==5))
[root@ 192.168.1.24 ~]$echo $?
1
[root@ 192.168.1.24 ~]$if ((8<7 && 5==5))
> then
> echo "条件判断为真"
> else
> echo "条件判断为假"
> fi
条件判断为假
[root@ 192.168.1.24 ~]$
(())所涉及的数字或变量都必须是整数,不能是小数,或者字符串,bc或awk可以用于小数运算,但一般用到的较少
3. a++ a-- ++a --a的使用
[root@ 192.168.1.24 ~]$a=10
# a++ 表达式执行完毕后再加1 ,即 先执行echo $a 再执行 a+1
[root@ 192.168.1.24 ~]$echo $((a++))
10
[root@ 192.168.1.24 ~]$echo $a
11
[root@ 192.168.1.24 ~]$echo $((a--))
11
[root@ 192.168.1.24 ~]$echo $a
10
# ++a 表达式执行前先加1,即 先执行 a+1 在执行 echo $a
[root@ 192.168.1.24 ~]$echo $((++a))
11
[root@ 192.168.1.24 ~]$echo $a
11
[root@ 192.168.1.24 ~]$echo $((--a))
10
[root@ 192.168.1.24 ~]$echo $a
10
(()) 表达式在命令执行时不需要加 $符号,直接使用 ((6%2)) 形式即可,但是如果要输出计算结果,就必须加 $
(()) 里面的所有字符之间没有空格,有空格不影响结果
4. let 运算命令的用法
let i=i+10 等同于 ((i=i+8)) ,但后者效率更高
[root@ 192.168.1.24 ~]$i=10
[root@ 192.168.1.24 ~]$let i=i+10
[root@ 192.168.1.24 ~]$echo $i
5. expr 命令的用法
# 运算符及用于计算的数字左右都至少有一个空格
[root@ 192.168.1.24 ~]$expr 2+2
2+2
[root@ 192.168.1.24 ~]$expr 2 + 2
4
[root@ 192.168.1.24 ~]$expr 2 - 2
0
# 注意2:使用乘法时,必须用反斜杠屏蔽其特殊含义
[root@ 192.168.1.24 ~]$expr 2 * 2
expr: syntax error
[root@ 192.168.1.24 ~]$expr 2 \* 2
4
[root@ 192.168.1.24 ~]$expr 2 / 2
1
# 配合变量使用
[root@ 192.168.1.24 ~]$i=10
[root@ 192.168.1.24 ~]$i=`expr $i + 10`
[root@ 192.168.1.24 ~]$echo $i
20
注意1: 运算符及用于计算的数字左右都至少有一个空格,否则报错
注意2: 使用乘法时,必须用反斜杠屏蔽其特殊含义
6. 通过expr判断变量是否为整数
# expr判断
# 非整数时
[root@ 192.168.1.24 ~]$i=10.11
[root@ 192.168.1.24 ~]$i=`expr $i + 10`
expr: non-integer argument
[root@ 192.168.1.24 ~]$echo $?
2
# 整数时
[root@ 192.168.1.24 ~]$i=`expr $i + 10`
[root@ 192.168.1.24 ~]$echo $?
0
由此可以看出, 可以通过$?的值判断变量是否为整数,如果是整数,$?=0 否则$?=2
7. bc linxu计算器
# 通过计算工具输出 1+2+3+4+5+6+7+8+9+10=55
[root@ 192.168.1.24 ~]$seq -s "+" 10
1+2+3+4+5+6+7+8+9+10
[root@ 192.168.1.24 ~]$echo `seq -s "+" 10`=`seq -s "+" 10|bc`
1+2+3+4+5+6+7+8+9+10=55
# 通过xargs
[root@ 192.168.1.24 ~]$echo `seq -s "+" 10`=`seq -s " + " 10|xargs expr`
1+2+3+4+5+6+7+8+9+10=55
# 通过$[]
[root@ 192.168.1.24 ~]$echo $[`seq -s "+" 20`]
210
[root@ 192.168.1.24 ~]$echo `seq -s "+" 10`=$(echo $[`seq -s "+" 10`])
1+2+3+4+5+6+7+8+9+10=55
8. awk 计算
适合小数和整数
[root@ 192.168.1.24 ~]$echo "7.7 3.8" |awk '{print ($1-$2)}'
3.9
[root@ 192.168.1.24 ~]$echo "7.7 3.8" |awk '{print ($1*$2)}'
29.26
[root@ 192.168.1.24 ~]$echo "7.7 3.8" |awk '{print ($1/$2)}'
2.02632
[root@ 192.168.1.24 ~]$echo "7.7 3.8" |awk '{print ($1%$2)}'
0.1
9. declare 命令的用法
[root@ 192.168.1.24 ~]$declare -i A=10 B=20 C
[root@ 192.168.1.24 ~]$C=A+B
[root@ 192.168.1.24 ~]$echo $C
30
[root@ 192.168.1.24 ~]$C=A/B
[root@ 192.168.1.24 ~]$echo $C
0
[root@ 192.168.1.24 ~]$C=A-B
[root@ 192.168.1.24 ~]$echo $C
-10
[root@ 192.168.1.24 ~]$C=B/A
[root@ 192.168.1.24 ~]$echo $C
2
[root@ 192.168.1.24 ~]$C=A*B
[root@ 192.168.1.24 ~]$echo $C
200
# 因为已经申明的A B C都是整形,因此可以直接进行运算了
网友评论