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
posted @   kyle_7Qc  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示