一、算数运算符
shell中常见的算术运算符:
shell中常见的算术命令:
1. 整数运算
方法一:expr
- expr命令就既可以用于整数运算,也可以用于相关字符串长度、匹配等的运算处理:
- expr 1 + 2 + - \* /
- expr $num1 + $num2 + - \* / %;
注:计算的数字左右都至少有一个空格,
乘号需要用反斜线屏蔽其特定含义,因为shell会误读星号。方法二:$(())
echo $(($num1+$num2)) + - * / %
echo $((num1+num2))
echo $((5-3*2))
echo $(((5-3)*2))
echo $((2**3))
echo $((a++)) 、 echo $((a--)) 先输出后加减
echo $((++a)) 、 echo $((--a)) 先加减后输出
sum=$((1+2)); echo $sum
方法三:$[]
echo $[5+2] + - * / %
echo $[5**2]
方法四:let
let sum=2+3; echo $sum
let i++; echo $i
2. 小数运算
echo "2*4" |bc
echo "2^4" |bc
echo "scale=2;6/4" |bc
awk 'BEGIN{print 1/2}'
echo "print 5.0/2" |python
二、算数运算的实例
2.1 关于$(())的实例
实例一:运算示例
[root@host-131 ~]# echo $((6+2)) #加法
[root@host-131 ~]# echo $((6-2)) #减法
[root@host-131 ~]# echo $((6*2)) #乘法
[root@host-131 ~]# echo $((6/2)) #除法
[root@host-131 ~]# echo $((6%2)) #余数
[root@host-131 ~]# echo $((6**2)) #幂运算
实例二:各种运算shell脚本示例
[root@host-131 ~]# cat vartest01.sh
#!/bin/bash
a=6
b=2
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%b=$(($a%$b))"
[root@host-131 ~]# chmod a+x vartest01.sh
[root@host-131 ~]# ./vartest01.sh
a-b=4
a-b=4
a*b=12
a/b=3
a**b=36
a%b=0
[root@host-131 ~]#
实例三:实现输入2个数字进行加、减、乘、除功能的计算器
[root@host-131 ~]# cat var_jisuan.sh
#!/bin/bash
#+,-,*,/ 2018-06-12
print_useage(){
printf "Please enter an int\n"
exit 1
}
read -p "Please input first number:" fnum
if [ -n "`echo $fnum |sed 's/[0-9]//g'`" ];then #-n选项可以理解为字符串 no zero
print_useage
fi
read -p "Please input the operators:" op
if [ "${op}" != "+" ]&&[ "$op" != "-" ]&&[ "$op" != "*" ]&&[ "$op" != "/" ];then
echo "Please use {+|-|*|/}"
exit 2
fi
read -p "Please input second number: " snum
if [ -n "`echo $snum | sed 's/[0-9]//g'`" ];then
print_useage
fi
echo "${fnum}${op}${snum}=$((${fnum}${op}${snum}))"
[root@host-131 ~]# chmod a+x var_jisuan.sh
[root@host-131 ~]# ./var_jisuan.sh
Please input first number:4
Please input the operators:+
Please input second number: 5
4+5=9
[root@host-131 ~]#
实例四:高效的计算方法
[root@host-131 ~]# cat var_jisuan02.sh
#!/bin/bash
read -p "Please input num=num1{+|-|*|/}num2:" num
echo $(($num))
[root@host-131 ~]# chmod a+x var_jisuan02.sh
[root@host-131 ~]# ./var_jisuan02.sh
Please input num=num1{+|-|*|/}num2:3*5
15
[root@host-131 ~]#
或者用如下方法:
[root@host-131 ~]# cat var_jisuan02.sh
#!/bin/bash
echo $(($1))
[root@host-131 ~]# sh var_jisuan02.sh 4+5
9
[root@host-131 ~]#
2.2 let运算命令实例
实例一、监控web服务状态,如果访问两次均失败,则报警。
#!/bin/bash
CheckUrl(){ #定义函数
timeout=5 #定义wget访问超时时间
fails=0 #初始化网站访问失败次数为0
success=0 #初始化网站访问成功次数为0
while true #持续循环
do
wget --timeout=$timeout --tries=1 https://www.cnblogs.com/yangleitao/ -q -O /dev/null #--tries
#增加重试次数。 -q 不显示下载过程 -O 下载并以不同的文件名保存
if [ $? -ne 0 ];then
let fails=fails+1
else
let success+=1
fi
if [ $success -ge 1 ];then
echo "success"
exit 0
fi
if [ $fails -ge 2 ];then
Critical="system is dowm."
echo $Critical|tee|mail -s "$Critical" abc@ddsaff.com
exit 2
fi
done
}
CheckUrl #执行函数
2. 3expr运算命令实例
实例1:判断一个变量值或者字符串是否为整数?
[root@host-131 ~]# cat var_expr.sh
#!/bin/bash
#持续等待输入
while true
do
read -p "Please input:" a
expr $a + 0 >/dev/null 2>&1 # 参考此博客理解Linux Shell 1>/dev/null 2>&1 含义 - CSDN博客 https://blog.csdn.net/ithomer/article/details/9288353
[ $? -eq 0 ]&&echo int||echo chars
done
[root@host-131 ~]# chmod a+x var_expr.sh
[root@host-131 ~]# ./var_expr.sh
Please input:yanglt
chars
Please input:123
int
Please input:^C
[root@host-131 ~]#
实例2:判断输入两个参数后进行混合运算:
[root@host-131 ~]# cat var_expr01.sh
#!/bin/bash
#n0.1
[ $# -ne 2 ]&&{
echo $"USAGE $0 num1 num2" #打印提示内容
exit 1
}
#n0.2
a=$1
b=$2
expr $a + $b + 10 &>/dev/null
if [ $? -ne 0 ] #如果返回为0至少有一个不是整数
then
echo "Please input two nums."
exit 2
fi
#n0.3
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%b=$(($a%$b))"
[root@host-131 ~]# chmod a+x var_expr01.sh
[root@host-131 ~]# ./var_expr01.sh 5 6
a-b=-1
a+b=11
a*b=30
a/b=0
a**b=15625
a%b=5
[root@host-131 ~]#
实例3:计算字符串长度
通过expr 计算字符串长度
[root@host-131 ~]# char="i am is yanglt"
[root@host-131 ~]# expr length "$char"
14
[root@host-131 ~]# expr ${#char}
14
[root@host-131 ~]# echo ${char} |wc -L
14
[root@host-131 ~]# echo ${char} |awk '{print length($0)}'
14
[root@host-131 ~]# echo ${#char}
14
[root@host-131 ~]# expr length "$char"
14
写一个shell脚本打印一段话中字符数小于6的单词。
[root@host-131 ~]# cat var_expr02.sh
#!/bin/bash
for n in You are welcome to learn with me shell
do
if [ `expr length $n` -lt 5 ]
then
echo $n
fi
done
[root@host-131 ~]# sh var_expr02.sh
You
are
to
with
me
[root@host-131 ~]#
2. 4 bc运算命令实例
1.将bc作为计算机使用
[root@host-131 ~]# 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+3
4
2*4
8
2.在命令行下使用,实现运算功能,配合变量运算
[root@host-131 ~]# echo 4+5|bc
9
[root@host-131 ~]# echo 4*5|bc
20
[root@host-131 ~]# echo 4.5+5.5|bc
10.0
[root@host-131 ~]# echo "scale=2;355/113"|bc #scale=2表示保留两位小数
3
[root@host-131 ~]# echo "scale=5;355/113"|bc
3.14159
[root@host-131 ~]# echo "scale=5;355/113"|bc
3.14159
[root@host-131 ~]# i=4
[root@host-131 ~]# echo $i+6 |bc
10
[root@host-131 ~]# a=`echo $i+6 |bc`
[root@host-131 ~]# echo $a
10
[root@host-131 ~]#
3、通过一条命令计算输出 1+2+3+...+10 的表达式,并计算结果。
[root@host-131 ~]# echo `seq -s '+' 10`=`seq -s "+" 10|bc` #bc计算
1+2+3+4+5+6+7+8+9+10=55
[root@host-131 ~]# echo `seq -s '+' 10`="$((`seq -s "+" 10`))" #$(()) 计算
1+2+3+4+5+6+7+8+9+10=55
[root@host-131 ~]# echo `seq -s '+' 10`=`seq -s " + " 10|xargs expr` #使用expr计算
1+2+3+4+5+6+7+8+9+10=55
[root@host-131 ~]# echo `seq -s '+' 10`=$(echo $[`seq -s "+" 10`]) #使用$[]计算
1+2+3+4+5+6+7+8+9+10=55
[root@host-131 ~]#
2.5 awk、declare实现计算
awk实现计算:
[root@host-131 ~]# echo "7.7 3.8 " |awk '{print ($1-$2)}'
3.9
[root@host-131 ~]# echo "358 113 " |awk '{print ($1-3)/$2}'
3.14159
[root@host-131 ~]# echo "3 9" |awk '{print ($1+3)*$2}'
54
[root@host-131 ~]#
declare实现计算:
[root@host-131 ~]# declare -i A=20 B=8
[root@host-131 ~]# A=A+B
[root@host-131 ~]# echo $A
28
[root@host-131 ~]#
2.6 $[] 符号的运算
[root@host-131 ~]# i=5
[root@host-131 ~]# i=$[i+6]
[root@host-131 ~]# echo $i
11
[root@host-131 ~]# echo $[2**3]
8
[root@host-131 ~]# echo $[2/3]
0
[root@host-131 ~]# echo $[2%3]
2
[root@host-131 ~]# echo $[2 % 3]
2