2.Shell的数值运算

一.Shell的数值运算

  1. expr 整数运算
    [root@web01 scripts]# expr 1+1
    1+1
    [root@web01 scripts]# expr oldboy
    oldboy
    [root@web01 scripts]# expr 1 + 1
    2
    [root@web01 scripts]# expr 1 - 1
    0
    [root@web01 scripts]# expr 1 * 11
    expr: 语法错误
    [root@web01 scripts]# expr 1 \* 11
    11
    [root@web01 scripts]# expr 110 / 11
    10
    [root@web01 scripts]# expr 1 + 1.5
    expr: 非整数参数
    案例:  判断传参输入是否为整数
        [root@web01 scripts]# num1=10
        [root@web01 scripts]# num2=11q
        [root@web01 scripts]# expr $num1 + 1 >/dev/null 2>&1
        [root@web01 scripts]# [ $? -ne 0 ] && echo "你输入的是非整数" || echo "你输入的是整数"
        你输入的是整数
        [root@web01 scripts]# expr $num2 + 1 >/dev/null 2>&1
        [root@web01 scripts]# [ $? -ne 0 ] && echo "你输入的是非整数" || echo "你输入的是整数"
        你输入的是非整数

2.$(()) 整数运算 运算效率最高

        [root@web01 scripts]# echo $((10+10))
        20
        [root@web01 scripts]# echo $((10-10))
        0
        [root@web01 scripts]# echo $((10*10))
        100
        [root@web01 scripts]# echo $((10/10))
        1

3.$[] 整数运算

        [root@web01 scripts]# echo $[10+10]
        20
        [root@web01 scripts]# echo $[10-10]
        0
        [root@web01 scripts]# echo $[10*10]
        100
        [root@web01 scripts]# echo $[10/10]
        1
        [root@web01 scripts]# echo $[10-10.5]
        -bash: 10-10.5: 语法错误: 无效的算术运算符 (错误符号是 ".5")

4.let 重点

        [root@web01 scripts]# let sum=10+10
        [root@web01 scripts]# echo $sum
        20
        [root@web01 scripts]# num1=100
        [root@web01 scripts]# num2=50
        [root@web01 scripts]# let sum=$num1+$num2
        [root@web01 scripts]# echo $sum
        150
        [root@web01 scripts]# let sum=$num1-$num2
        [root@web01 scripts]# echo $sum
        50
        [root@web01 scripts]# let sum=$num1*$num2
        [root@web01 scripts]# echo $sum
        5000
        [root@web01 scripts]# let sum=$num1/$num2
        [root@web01 scripts]# echo $sum
        2
        i++   变量自增
        [root@web01 scripts]# let i=i+1
        [root@web01 scripts]# echo $i
        1
        [root@web01 scripts]# let i++
        [root@web01 scripts]# echo $i
        2
        [root@web01 scripts]# let i++
        [root@web01 scripts]# let i++
        [root@web01 scripts]# let i++
        [root@web01 scripts]# let i++
        [root@web01 scripts]# echo $i
        6
        [root@web01 scripts]# sh for.sh
        7
        [root@web01 scripts]# sh -x for.sh 
        + for i in I am lizhenya teacher I am 18
        + let a++
        + for i in I am lizhenya teacher I am 18
        + let a++
        + for i in I am lizhenya teacher I am 18
        + let a++
        + for i in I am lizhenya teacher I am 18
        + let a++
        + for i in I am lizhenya teacher I am 18
        + let a++
        + for i in I am lizhenya teacher I am 18
        + let a++
        + for i in I am lizhenya teacher I am 18
        + let a++
        + echo 7
        7
        [root@web01 scripts]# let c++
        [root@web01 scripts]# let c++
        [root@web01 scripts]# let c++
        [root@web01 scripts]# let c++
        [root@web01 scripts]# let c++
        [root@web01 scripts]# let c++
        [root@web01 scripts]# let c++
        [root@web01 scripts]# echo $c
        7

5.bc awk python (bc需要安装)

        [root@web01 scripts]# echo 10+10|bc
        20
        [root@web01 scripts]# echo 10-10|bc
        0
        [root@web01 scripts]# echo 10*10|bc
        100
        [root@web01 scripts]# echo 10/10|bc
        1
        [root@web01 scripts]# echo 10+10.5|bc
        20.5
        [root@web01 scripts]# awk 'BEGIN{print 10+10}'
        20
        [root@web01 scripts]# awk 'BEGIN{print 10-10}'
        0
        [root@web01 scripts]# awk 'BEGIN{print 10/10.5}'
        0.952381
        [root@web01 scripts]# awk 'BEGIN{print 10*10.5}'
        105
        [root@web01 scripts]# awk 'BEGIN{print 10^10.5}'
        3.16228e+10
        [root@web01 scripts]# awk 'BEGIN{print 10^10}'
        10000000000
        [root@web01 scripts]# echo 100 200
        100 200
        [root@web01 scripts]# echo 100 200|awk '{print $1+$2}'
        300

        [root@web01 scripts]# python
        Python 2.7.5 (default, Oct 30 2018, 23:45:53) 
        [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
        Type "help", "copyright", "credits" or "license" for more information.
        >>> 10+10
        20
        >>> 10-10
        0
        >>> 10*10
        100
        >>> 10/10
        1
        >>> 10/10.5
        0.9523809523809523
        >>> 

6.小结:expr (())[] let bc awk python

案例1:

        ps axu 中的VSZ 列 所有的数相加 得出结果
        [root@web01 scripts]# ps axuf|awk '{print $5}'|grep -v VSZ|tr "\n" "+"|sed -r 's#(.*)#\10\n#g'|bc
        12778952

案例2:

        做一个加减乘除的计算器
        例如:
        请输入第一个数字 10
        请输入第二个数字 20
        显示的结果  10+20=30
        
        [root@web01 scripts]# cat count.sh 
        #!/bin/sh
        read -p "请输入第一个数字: " num1
        read -p "请输入第二个数字: " num2
        echo "$num1+$num2=$[$num1+$num2]"
        echo "$num1-$num2=$[$num1-$num2]"
        echo "$num1*$num2=$[$num1*$num2]"
        echo "$num1/$num2=$[$num1/$num2]"

二.表达式

1.条件表达式

    []======test   []常用
    [ -f file ] 文件是否存在 且为普通文件 重点
    [ -e file ] 文件存在则为真
    [ -d file ] 目录存在则为真         重点
    [ -x file ] 文件有执行权限则为真
    [ -w file ]  文件可写则为真
    [ -r file ]  文件可读则为真

举例:

    [root@web01 scripts]# [ -f /etc/hosts ] && echo 为真 || echo 为假
    为真
    [root@web01 scripts]# [ -f /etc/hostsss ] && echo 为真 || echo 为假
    为假
    [root@web01 scripts]# [ -d /etc/hosts ] && echo 为真 || echo 为假
    为假
    [root@web01 scripts]# [ ! -d /etc/hosts ] && echo 为真 || echo 为假
    为真
    [root@web01 scripts]# [ -e /etc/hosts ] && echo 为真 || echo 为假
    为真
    [root@web01 scripts]# [ -e /etc/ ] && echo 为真 || echo 为假
    为真
    [root@web01 scripts]# [ -r /etc/ ] && echo 为真 || echo 为假
    为真
    [root@web01 scripts]# [ -w /etc/ ] && echo 为真 || echo 为假
    为真
    [root@web01 scripts]# [ -x /etc/ ] && echo 为真 || echo 为假
    为真
    [root@web01 scripts]# [ -x /etc/hosts ] && echo 为真 || echo 为假
    [root@web01 scripts]# [ -x /etc/hosts ] && echo 为真 || echo 为假
    为假
    [root@web01 scripts]# [ -x /etc/hosts ] && echo 为真 || echo 为假
    为假
    [root@web01 scripts]# ll
    总用量 24
    -rw-r--r-- 1 root root 230 8月   1 16:07 count.sh
    -rw-r--r-- 1 root root  74 8月   1 15:33 for.sh
    -rw-r--r-- 1 root root 297 7月  31 16:59 ip.sh
    -rw-r--r-- 1 root root  14 8月   1 15:06 oldboy.sh
    -rw-r--r-- 1 root root 152 7月  31 17:12 ping.sh
    -rwxr-xr-x 1 root root 225 7月  31 16:34 test.sh
    [root@web01 scripts]# [ -x test.sh ] && echo 为真 || echo 为假
    为真

案例: -f 判断文件是否存在

    [root@web01 scripts]# [ -f /etc/init.d/functions ] && . /etc/init.d/functions
    [root@web01 scripts]# action "hehehe is"  /bin/true
    hehehe is                                                  [  确定  ]
    [root@web01 scripts]# action "hehehe is"  /bin/false
    hehehe is                                                  [失败]
    函数库使用
    [root@web01 scripts]# cat ping.sh 
    #!/bin/sh
    [ -f /etc/init.d/functions ] && . /etc/init.d/functions
    read -p "请输入一个网址: " url
    ping -c 1 -W 1 $url >/dev/null 2>&1
    [ $? -eq 0 ] && action "ping $url is" /bin/true || action "ping $url is" /bin/false

    -d 判断是否为目录 目录是否存在
    [root@web01 scripts]# [ -d /alex ] || mkdir /alex
    [root@web01 scripts]# test -f /etc/hosts && echo ok || echo error
    ok
    [root@web01 scripts]# test -d /etc/hosts && echo ok || echo error
    error
    [root@web01 scripts]# test -d /etc/ && echo ok || echo error
    ok

三.数值比较

1.数值比较

    [ 数值1 比较符 数值2 ]
    -eq   相等
    -ne   不等于
    -gt   大于
    -ge   大于等于
    -lt   小于
    -le   小于等于

2.举例

    [root@web01 scripts]# [ 10 -eq 10 ] && echo ok || echo error
    ok
    [root@web01 scripts]# [ 10 -gt 10 ] && echo ok || echo error
    error
    [root@web01 scripts]# [ 10 -ge 10 ] && echo ok || echo error
    ok
    [root@web01 scripts]# [ 10 -ne 10 ] && echo ok || echo error
    error
    [root@web01 scripts]# [ 10 -lt 10 ] && echo ok || echo error
    error
    [root@web01 scripts]# [ 10 -le 10 ] && echo ok || echo error
    ok

3.案例

统计当前磁盘的使用率 如果大于5% 则把内容写入到以日期为名称的文本中 2019-08-01.txt
如果小了 则把当前的使用率 写入 2019-08-01.txt
1.如何取出当前的使用率
  df -h|awk 'NR==2{print $(NF-1)}'
  df -h|grep /$|awk '{print $(NF-1)}'
2.条件表达式 整数的比较
3.输出结果到文本
4.调试
[root@shell scripts]# cat usedisk.sh 
#!/bin/sh
time=`date +%F`
usedisk=`df -h|grep /$|awk '{print $(NF-1)}'`
[ ${usedisk%\%} -gt 5 ] && echo "当前使用率不正常 $usedisk" >> ${time}.txt || echo "当前使用率正常 $usedisk" >> ${time}.txt 
[root@web01 scripts]# [ `df -h|grep /$|awk -F "[ %]+" '{print $(NF-1)}'` -gt 5 ] && echo error || echo ok
error
[root@web01 scripts]# [ `df -h|grep /$|awk -F "[ %]+" '{print $(NF-1)}'` -gt 80 ] && echo error || echo ok
ok

4.案例

统计系统内存的使用率 如果大于10则 echo 使用率到 以时间命名的文件中
1.如何取出当前的使用率
  百分比=====使用的除总数乘100
2.条件表达式 整数的比较
3.输出结果到文本
4.调试
[root@web01 scripts]# free|awk 'NR==2{print $3/$2*100}'
19.0124
[root@web01 scripts]# free=`free|awk 'NR==2{print $3/$2*100}'`
[root@web01 scripts]# [ ${free%.*} -gt 10 ] && echo error || echo ok
error
[root@web01 scripts]# [ ${free%.*} -gt 80 ] && echo error || echo ok
ok
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容