Shell编程 - 运算篇
1. Shell表达式
| 表达式 | 示例 |
|---|---|
| [ expression ] | [ 1 -eq 1 ] |
| [[ expression ]] | [[ 1 -eq 1 ]] |
| test expression | test 1 -eq 1 ,等同于[] |
2. 整数比较符
| 比较符 | 描述 | 示例 |
|---|---|---|
| -eq,equal | 等于 | [ 1 -eq 1 ]为true |
| -ne,not equal | 不等于 | [ 1 -ne 1 ]为false |
| -gt,greater than | 大于 | [ 2 -gt 1 ]为true |
| -lt,lesser than | 小于 | [ 2 -lt 1 ]为false |
| -ge,greater or equal | 大于或等于 | [ 2 -ge 1 ]为true |
| -le,lesser or equal | 小于或等于 | [ 2 -le 1 ]为false |
3. 整数运算符
| 运算符 | 描述 |
|---|---|
| + | 加法 |
| - | 减法 |
| * | 乘法 |
| / | 除法 |
| % | 取余 |
| ^或** 幂、指数 | 2^10=1024 10个2相乘. |
| i=i+1 i++ | 计数,计算次数 |
| j=j+1 j+=1 | 求和,累加 |
| && | 并且,前一个命令执行成功,再执行后面的命令(判断) |
| || | 或者,前一个命令执行失败,再执行后面的命令(判断) |
随机的数字(n)对一个数字取余可以得到0到n-1范围的随机数。
echo $RANDOM%5 |bc
4.运算方法
| 命令 | 描述 | 示例 |
|---|---|---|
| awk | 可以进行计算,带小数,可以与shell脚本进行变量传递 | |
| let | 赋值并运算,支持++、-- | let VAR=(1+2)*3 ; echo $VAR x=10 ; y=5 let x++;echo $x 每执行一次x加1 let y--;echo $y 每执行一次y减1 let x+=2 每执行一次x加2 let x-=2 每执行一次x减2 |
| expr | 乘法*需要加反斜杠转义* | expr 1 * 2 运算符两边必须有空格 expr ( 1 + 2 ) * 2 使用双括号时要转义 |
| bc | 计算器,支持浮点运算、平方等 | bc本身就是一个计算器,可直接输入命令,进入解释器。 echo 1 + 2 |bc 将管道符前面标准输出作为bc的标准输入 echo "1.2+2" |bc echo "10^10" |bc echo 'scale=2;10/3' |bc 用scale保留两位小数点 |
- awk进行计算
基础用法:
awk 'BEGIN{print 1/3}'
awk 'BEGIN{print 1/3*100}'
使用变量 -v
awk -vn1=1 -vn2=3 'BEGIN{print n1/n2}'
0.333333
awk -v选项用于创建或修改awk中的变量。-v是shell脚本与awk桥梁
在awk中各种变量直接使用即可,不要加上$n1,如果加上了会被awk识别为取列
- 由于Shell不支持浮点数比较,可以借助bc来完成需求:
- -l显示小数.
echo 1/3 |bc -l
echo 2^10 |bc -l
# echo "1.2 < 2" |bc
1
# echo "1.2 > 2" |bc
0
# echo "1.2 == 2.2" |bc
0
# echo "1.2 != 2.2" |bc
1
运算如果为真返回1,否则返回0,例子:
# [ $(echo "2.2 > 2" |bc) -eq 1 ] && echo yes || echo no
yes
# [ $(echo "2.2 < 2" |bc) -eq 1 ] && echo yes || echo no
no
- expr还可以对字符串操作:
- 使用注意事项:使用空格,对*号转义
[root@web01 ~]# expr 1+1 1+1 [root@web01 ~]# expr 1 + 1 2 [root@web01 ~]# expr 2 * 2 expr: 语法错误 [root@web01 ~]# expr 2 \* 2 4 [root@web01 ~]# expr 2 / 2 1 - 获取字符串长度:
# expr length "string" 6 - 截取字符串:
# expr substr "string" 4 6 ing - 获取字符在字符串中出现的位置:
# expr index "string" str 1 # expr index "string" i 4 - 获取字符串开始字符出现的长度:
# expr match "string" s.* 6 # expr match "string" str 3 - 判断数字
检查是否为数字(整数) expr "$num1" + "$num2" + 666 &>/dev/null #0 1是正常 #2 3是异常 if [ $? -ge 2 ];then echo "Usage $0 num1 num2" exit 1 fi
- 使用注意事项:使用空格,对*号转义
- let,$(()), $[]
- 不支持小数,一般进行简单计算
- let
n1=666 n2=999 let c=n1+n2 这是用法 echo $c 1665 let i++ - $(())
n1=666 n2=999 echo $((n1+n2)) 1665 d=$((n1+n2)) echo $d 1665 这是用法 echo $((RANDOM%100)) 生成0-99随机数 echo $((RANDOM%100+1)) 生成1-100随机数 - $[]
n1=666 n2=999 e=$[n1+n2] echo $e 1665
案例1:print absolute value of an integer:⭐
root@web01:/service/scripts# cat int.sh
#!/bin/bash
read -p "请输入一个数字a:" a
if [ $a -ge 0 ];then
echo $a
else
echo $[-a] 或 $((-$a))
fi
案例2:计算器,传入脚本中2个参数,进行计算,输出结果。(传参)⭐
-
流程:
- 用户传入2个参数
- 判断是否为数字,如果不是,显示提示信息然后脚本结束.
- 计算,输出结果(awk,bc)
-
方式一:
![]()
-
方式二:
[root@web01 ~]# cat calc.sh
#!/bin/bash
m=0
read -p "请输入数字:" num1
if [[ ! "$num1" =~ ^[0-9]+$ ]];then
echo "请输入正确的数字"
exit
fi
read -p "请输入运算符:" a
for str in + - \* /
do
if [ "$str" = "$a" ];then
let m++
fi
done
[ $m -eq 0 ]&&{
echo "请输入正确的运算符"
exit
}
read -p "请输入数字:" num2
if [[ ! "$num2" =~ ^[0-9]+$ ]];then
echo "请输入正确的数字"
exit
fi
sum=$[ num1 $a num2 ]
echo $num1 $a $num2 的结果为:$sum
[root@web01 ~]#
[root@web01 ~]# bash calc.sh
请输入数字:a
请输入正确的数字
[root@web01 ~]# bash calc.sh
请输入数字:1
请输入运算符:a
请输入正确的运算符
[root@web01 ~]# bash calc.sh
请输入数字:1
请输入运算符:+
请输入数字:a
请输入正确的数字
[root@web01 ~]# bash calc.sh
请输入数字:1
请输入运算符:+
请输入数字:3
1 + 3 的结果为:4


浙公网安备 33010602011771号