shell脚本之expr语法和算术运算
题记:感觉ksh和bash语法差不多,csh同C语言语法相似
二、expr
语法:用来计算表达式的值
注释:expr的每个参数之间必须用空格分隔,特殊字符需转义
分类:
1、逻辑表达求值
1)ARG1 | ARG2
注释:ARG1既不为空也不为0时,取ARG1的值,否则取ARG2的值
示例:
linux-mdcc:~ # expr 1 \| 2
1
linux-mdcc:~ # expr 1 \| 0
1
linux-mdcc:~ # expr 0 \| 2
2
linux-mdcc:~ # expr 0 \| 0
0
2)ARG1 & ARG2
注释:ARG1并且ARG2既不为空也不为0时取ARG1的值,否则取值0
示例:
linux-mdcc:~ # expr 1 \& 2
1
linux-mdcc:~ # expr 0 \& 2
0
linux-mdcc:~ # expr 2 \& 0
0
linux-mdcc:~ # expr 0 \& 0
0
3)ARG1 < ARG2
注释:ARG1 小于ARG2时为真,取值1
示例:
linux-mdcc:~ # expr 0 \< 1
1
linux-mdcc:~ # expr 0 \>= 1
0
4)ARG1 <= ARG2
注释:ARG1 小于或等于ARG2时为真,取值1
示例:
linux-mdcc:~ # expr 0 \<= 1
1
linux-mdcc:~ # expr 1 \<= 1
1
linux-mdcc:~ # expr 0 \> 0
0
5)ARG1 = ARG2
注释:ARG1 等于ARG2时为真,取值1
示例:
linux-mdcc:~ # expr 1 \= 1
1
linux-mdcc:~ # expr 2 \= 1
0
linux-mdcc:~ # expr 1 \!= 1
0
6)ARG1 != ARG2
注释:ARG1 不等于ARG2时为真,取值1
示例:
linux-mdcc:~ # expr 1 != 2
1
linux-mdcc:~ # expr 1 != 1
0
7)ARG1 >= ARG2
注释:ARG1 大于或等于ARG2时为真,取值1
示例:
linux-mdcc:~ # expr 2 \>= 1
1
linux-mdcc:~ # expr 1 \>= 1
1
linux-mdcc:~ # expr 0 \>= 1
0
8)ARG1 > ARG2
注释:ARG1 大于ARG2时为真,取值1
示例:
linux-mdcc:~ # expr 1 \> 0
1
linux-mdcc:~ # expr 0 \> 1
0
linux-mdcc:~ # expr 1 \> 1
0
2、数学表达式求值
9)ARG1 + ARG2
注释:加法运算
示例:
linux-mdcc:~ # expr 1 + 1
2
10)ARG1 - ARG2
注释:减法运算
示例:
linux-mdcc:~ # expr 3 - 1
2
11)ARG1 * ARG2
注释:乘法运算
示例:
linux-mdcc:~ # expr 2 \* 4
8
12)ARG1 / ARG2
注释:除法运算
示例:linux-mdcc:~ # expr 8 \/ 2
4
13)ARG1 % ARG2
注释:求余运算
示例:
linux-mdcc:~ # expr 8 % 3
2
3、字符表达式求值
14)string : REGEXP
注释:string 匹配到REGEXP时为真,取值为1
示例:
linux-mdcc:~ # expr aaaaAAAA \: [a-zA-Z].*
8
15)match STRING REGEXP
注释:同string : REGEXP
示例:
linux-mdcc:~ # expr match aaaaAAAA [a-zA-z].*
8
16)substr STRING POS LENGTH
注释:截取STRING ,从POS位置截取长度为LENGTH的子串
示例:
linux-mdcc:~ # expr substr strings 2 3
tri
17)index STRING CHARS
注释:取出CHARS在STRING 中的索引,如果没找到,值为0;这个命令的结果不是很准确
示例:
linux-mdcc:~ # expr index abcdefghijk bc
2
18)length STRING
注释:字符串的长度
示例:
linux-mdcc:~ # expr length adfasfaf
8
19)+ TOKEN
注释:字符串连接符,限于个人理解
示例:
linux-mdcc:~ # expr 1+1
1+1
linux-mdcc:~ # expr + match
match
linux-mdcc:~ # expr + /
/
结束语:一直觉得expr不是很好用,好在各种Shell也有自己的运算方法
三、算术运算
1、Bourne shell
1)整数运算
注释:没有内置算术运算,使用expr命令进行简单的整数算术运算
示例:
wsnjc-2268:~ # expr 1 + 4
5
wsnjc-2268:~ # expr 1+4
1+4
wsnjc-2268:~ # expr 5 + 9 / 3
8
wsnjc-2268:~ # expr 5 * 4
expr: syntax error
wsnjc-2268:~ # expr 5 \* 4 - 2
18
wsnjc-2268:~ # expr 11 % 3
2
wsnjc-2268:~ # num=1
wsnjc-2268:~ # num=`expr $num + 1 `
wsnjc-2268:~ # echo $num
2
2)浮点运算
注释:没有内置算术运算,使用bc,awk程序进行浮点运算
示例:
wsnjc-2268:~ # echo "scale=3; 13 / 2" | bc
6.500
wsnjc-2268:~ # n=`bc << EOF
> scale=3
> 13/2
> EOF`
wsnjc-2268:~ # echo $n
6.500
wsnjc-2268:~ # product=`echo "sdf" | awk
'BEGIN{x=2.45;y=3.123}{printf "%.2f\n",x*y}'`
wsnjc-2268:~ # echo $product
7.65
2、C shell和TC shell
1)整数算术运算
语法:运算符+ - * / % << >> += -= *= /= ++
--
注释:只支持整数的算术运算,符号@用于将计算结果赋给数值变量;变量(作为右操作数的)需要使用$符号引用其值
示例:
linux-mdcc /root# @ sum = 4 + 6
linux-mdcc /root# echo $sum
10
linux-mdcc /root# @ sum++
linux-mdcc /root# echo $sum
11
linux-mdcc /root# @ sum += 3
linux-mdcc /root# echo $sum
14
linux-mdcc /root# @ sum--
linux-mdcc /root# echo $sum
13
linux-mdcc /root# @ n = 3+4
@: Badly formed number.
2)浮点算术运算
注释:不支持浮点运算,使用使用程序进行操作
示例:同上,使用bc和awk程序进行操作
3、Korn shell
1)算术运算
语法:typeset -i -i# -F -E; integer是typeset -i
的别名
注释:支持整型运算,1998版后支持浮点运算
示例:
linux-mdcc:/root # typeset -i num
linux-mdcc:/root # num=hello
linux-mdcc:/root # echo $num
0
linux-mdcc:/root # num=5 + 5
ksh: +: not found [No such file or directory]
linux-mdcc:/root # num=5+5
linux-mdcc:/root # echo $num
10
linux-mdcc:/root # num=4*6
linux-mdcc:/root # echo $num
24
linux-mdcc:/root # num="4 * 6"
linux-mdcc:/root # echo $num
24
linux-mdcc:/root # num=6.789
linux-mdcc:/root # echo $num
6
2)使用不同的基数
linux-mdcc:/root # num=15
linux-mdcc:/root # typeset -i2 num
linux-mdcc:/root # print $num
2#1111
linux-mdcc:/root # typeset -i8 num
linux-mdcc:/root # print $num
8#17
linux-mdcc:/root # typeset -i16 num
linux-mdcc:/root # print $num
16#f
linux-mdcc:/root # read number
2#1101
linux-mdcc:/root # print $number
2#1101
linux-mdcc:/root # typeset -i number
linux-mdcc:/root # print $number
13
linux-mdcc:/root # typeset -i2 number
linux-mdcc:/root # print $number
2#1101
linux-mdcc:/root # typeset -i8 number
linux-mdcc:/root # print $number
8#15
3)let命令
注释:Korn shell的内置命令,用来执行整型运算
示例:
linux-mdcc:/root # let i=i+1
linux-mdcc:/root # print $i
6
linux-mdcc:/root # let "i = i + 2"
linux-mdcc:/root # print $i
8
linux-mdcc:/root # let "i+=1"
linux-mdcc:/root # print $i
9
4)对于空格,可以用(())和""屏蔽掉
linux-mdcc:/root # ((i=9))
linux-mdcc:/root # (( i = i * 6))
linux-mdcc:/root # ((i = 9 ))
linux-mdcc:/root # clear
linux-mdcc:/root # (( i = 9 ))
linux-mdcc:/root # (( i = i * 6 ))
linux-mdcc:/root # print $i
54
linux-mdcc:/root # (( i > 0 && i <=
10 ))
linux-mdcc:/root # print $?
1
linux-mdcc:/root # j=100
linux-mdcc:/root # (( i < j || i == 5 ))
linux-mdcc:/root # print $?
0
linux-mdcc:/root # if (( i < j && i ==
54 ))
> then
> print True
> fi
True
4、Bash shell
1)算术运算
注释:同Korn shell,用declare声明整型;(())中的变量(作为右操作数的)前面也可以加上$符号,效果相同
示例:
linux-mdcc:~ # declare -i num
linux-mdcc:~ # num=hello
linux-mdcc:~ # echo $num
0
linux-mdcc:~ # num=5 + 5
~ ~
linux-mdcc:~ # num=5+5
linux-mdcc:~ # echo $num
10
linux-mdcc:~ # num=4*6
linux-mdcc:~ # echo $num
24
linux-mdcc:~ # num="4 * 6"
linux-mdcc:~ # echo $num
24
linux-mdcc:~ # num=6.5
-bash: 6.5: syntax error in expression_r(error
token is ".5")
==============================================================
linux-mdcc:~ # declare -i x=017
linux-mdcc:~ # echo $x
15
linux-mdcc:~ # x=2#101
linux-mdcc:~ # echo $x
5
linux-mdcc:~ # x=8#17
linux-mdcc:~ # echo $x
15
linux-mdcc:~ # x=16#b
linux-mdcc:~ # echo $x
11
==============================================================
linux-mdcc:~ # let i=5
linux-mdcc:~ # let i=i+1
linux-mdcc:~ # echo $i
6
linux-mdcc:~ # let "i = i + 2"
linux-mdcc:~ # echo $i
8
linux-mdcc:~ # let "i+=1"
linux-mdcc:~ # echo $i
9
linux-mdcc:~ # i=3
==============================================================
linux-mdcc:~ # ((i+=4))
linux-mdcc:~ # echo $i
7
linux-mdcc:~ # ((i=i-2))
linux-mdcc:~ # echo $i
5
2)浮点运算
注释:同bc,awk计算程序对浮点数的计算
结束语:这里遇到了bc运算;内联输入;以及awk操作,实在是没有想到的,这些功能都好强大又容易被大家忽略的啊!