Shell脚本编程基础之shell脚本算术运算

算术运算

加减乘除,指数运算,取模等等

利用$RANDOM生成1-100的随机数

任意一个随机正整数除以100的余数都是介于0-99之间,再加上1,就是1-100之间的随机数

[23:11:31 root@C8-3-55 ~]#echo $((RANDOM%100+1))
50
[23:16:50 root@C8-3-55 ~]#echo $((RANDOM%100+1))
40
[23:16:53 root@C8-3-55 ~]#echo $((RANDOM%100+1))
20
[23:16:54 root@C8-3-55 ~]#echo $((RANDOM%100+1))
3
[23:16:55 root@C8-3-55 ~]#echo $((RANDOM%100+1))
24

利用$RANDOM生成随机颜色文本

[23:44:10 root@C8-3-55 ~]#COLOR=$[RANDOM%7+31];echo -e "\E[${COLOR};1m${COLOR}\E[0m"
32
[23:44:32 root@C8-3-55 ~]#COLOR=$[RANDOM%7+31];echo -e "\E[${COLOR};1m${COLOR}\E[0m"
35
[23:44:34 root@C8-3-55 ~]#COLOR=$[RANDOM%7+31];echo -e "\E[${COLOR};1m${COLOR}\E[0m"
31
[23:44:35 root@C8-3-55 ~]#COLOR=$[RANDOM%7+31];echo -e "\E[${COLOR};1m${COLOR}\E[0m"
36
[23:44:36 root@C8-3-55 ~]#COLOR=$[RANDOM%7+31];echo -e "\E[${COLOR};1m${COLOR}\E[0m"
35
[23:44:37 root@C8-3-55 ~]#COLOR=$[RANDOM%7+31];echo -e "\E[${COLOR};1m${COLOR}\E[0m"
32

Shell脚本编程基础之shell脚本算术运算

增强的算术运算let

[23:44:40 root@C8-3-55 ~]#help let
let: let 参数 [参数 ...]
    估值算术表达式。

    将每个 ARG 参赛作为算术表达式来估值。估值的计算以定宽的整
    数完成,不带溢出检测,不过除 0 是被置陷阱的并且会报一个错
    误。下列操作符被按照相同的算术优先级组合。列表的顺序按照
    优先级从高至低。


        id++, id--      变量后置加,后置减
        ++id, --id      变量前置加,前置减
        -, +            一元减法,一元加法
        !, ~            逻辑和位取反
        **              指数
        *, /, %         乘法,除法,取余数
        +, -            增加,减少
        <<, >>          向左和向右按位移位
        <=, >=, <, >    比较
        ==, !=          等于,不等于
        &               按位与
        ^               按位异或
        |               按位或
        &&              逻辑与
        ||              逻辑或
        expr ? expr : expr
                        条件操作符
        =, *=, /=, %=,
        +=, -=, <<=, >>=,
        &=, ^=, |=      赋值

    Shell 变量允许作为操作数。表达式中的变量的名称会被取代以值
    (强制转换为定宽的整数)。表达式中的变量不需要打开整数属性。

    操作符按照优先级进行估值。括号中的子表达式将被先估值,并可取代上述表达式规则。

    退出状态:
    如果最后一个 ARG 参数估值为 0,则 let 返回 1; 否则 let 返回 0。

let运算之i++和++i

  • 加号在后,先赋值完了再加
  • 加号在线,先加完了再说
[23:46:29 root@C8-3-55 ~]#unset j;i=1;let j=i++;echo i=$i j=$j
i=2 j=1
[23:51:49 root@C8-3-55 ~]#let j=i++;echo i=$i j=$j
i=3 j=2
[23:51:58 root@C8-3-55 ~]#let j=i++;echo i=$i j=$j
i=4 j=3
[23:52:00 root@C8-3-55 ~]#let j=i++;echo i=$i j=$j
i=5 j=4
[23:52:00 root@C8-3-55 ~]#let j=i++;echo i=$i j=$j
i=6 j=5
[23:52:01 root@C8-3-55 ~]#let j=i++;echo i=$i j=$j
i=7 j=6

[23:52:02 root@C8-3-55 ~]#unset j;i=1;let j=++i;echo i=$i j=$j
i=2 j=2
[23:52:27 root@C8-3-55 ~]#let j=++i;echo i=$i j=$j
i=3 j=3
[23:52:37 root@C8-3-55 ~]#let j=++i;echo i=$i j=$j
i=4 j=4
[23:52:38 root@C8-3-55 ~]#let j=++i;echo i=$i j=$j
i=5 j=5
[23:52:38 root@C8-3-55 ~]#let j=++i;echo i=$i j=$j
i=6 j=6
[23:52:39 root@C8-3-55 ~]#let j=++i;echo i=$i j=$j
i=7 j=7

外部运算命令expr

[01:36:44 root@C8-3-55 ~]#type expr
expr 是 /usr/bin/expr
[02:42:06 root@C8-3-55 ~]#expr --help
用法:expr 表达式
 或:expr 选项

      --help            显示此帮助信息并退出
      --version         显示版本信息并退出

将表达式的值列印到标准输出,分隔符下面的空行可提升算式优先级。
可用的表达式有:

  ARG1 | ARG2       若ARG1 的值不为0 或者为空,则返回ARG1,否则返回ARG2

  ARG1 & ARG2       若两边的值都不为0 或为空,则返回ARG1,否则返回 0

  ARG1 < ARG2       ARG1 小于ARG2
  ARG1 <= ARG2      ARG1 小于或等于ARG2
  ARG1 = ARG2       ARG1 等于ARG2
  ARG1 != ARG2      ARG1 不等于ARG2
  ARG1 >= ARG2      ARG1 大于或等于ARG2
  ARG1 > ARG2       ARG1 大于ARG2

  ARG1 + ARG2       计算 ARG1 与ARG2 相加之和
  ARG1 - ARG2       计算 ARG1 与ARG2 相减之差

  ARG1 * ARG2       计算 ARG1 与ARG2 相乘之积
  ARG1 / ARG2       计算 ARG1 与ARG2 相除之商
  ARG1 % ARG2       计算 ARG1 与ARG2 相除之余数

  字符串 : 表达式               定位字符串中匹配表达式的模式

  match 字符串 表达式           等于"字符串 :表达式"
  substr 字符串 偏移量 长度     替换字符串的子串,偏移的数值从 1 起计
  index 字符串 字符             在字符串中发现字符的地方建立下标,或者标0
  length 字符串                 字符串的长度
  + TOKEN                    interpret TOKEN as a string, even if it is a
                               keyword like 'match' or an operator like '/'

  ( EXPRESSION )             value of EXPRESSION

请注意有许多运算操作符都可能需要由 shell 先实施转义。
如果参与运算的 ARG 自变量都是数字,比较符就会被视作数学符号,否则就是多义的。
模式匹配会返回"\"和"\"之间被匹配的子字符串或空(null);如果未使用"\"和"\",
则会返回匹配字符数量或是 0。

若表达式的值既不是空也不是 0,退出状态值为 0;若表达式的值为空或为 0,
退出状态值为 1。如果表达式的句法无效,则会在出错时返回退出状态值 3。

利用shell计算鸡兔同笼

上三十五头,下九十四足,求鸡兔各多少只。

[02:42:15 root@C8-3-55 ~]#vim cr_v1.0.sh

[02:54:52 root@C8-3-55 ~]#bash cr_v1.0.sh 35 94
Rabbit:12
Chook:23
[02:55:05 root@C8-3-55 ~]#cat cr_v1.0.sh
#!/bin/bash
HEAD=$1
FOOT=$2
R=$[(FOOT-2*HEAD)/2]
C=$[HEAD-R]
echo "Rabbit:$R"
echo "Chook:$C"
上一篇:箭头函数this的指向


下一篇:[Python] 在测试中使用 Mock