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
增强的算术运算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"
* * *
胖并快乐着的死肥宅
* * *