shell中进行整数运算需要借助一些辅助工具,如:expr、declare、let、(( ))、$[ ]
1、expr有很多不完善之处,此处不写。
2、declare:
declare -i 命令定义×××变量,当使用此命令对变量赋值后,变量便可进行算术运算。
需要注意的是:
如果给×××变量赋值的是一个字符串值,则bash会将变量赋值为0。
使用declare -i命令生成的变量执行算术运算时,各变量之间不能有空格。
test@kickseed:~$ declare -i m n
test@kickseed:~$ m=1
test@kickseed:~$ n=2
test@kickseed:~$ m+=1
test@kickseed:~$ n+=2
test@kickseed:~$ echo $m $n
2 4
test@kickseed:~$ m=m+n
test@kickseed:~$ echo $m
6
新声明一个×××变量d,进行计算
test@kickseed:~$ declare -i d
test@kickseed:~$ d=m+n
test@kickseed:~$ echo $d
10
使用一个未声明为×××的变量c,进行计算
test@kickseed:~$ c=m+n
test@kickseed:~$ echo $c
m+n
使用双引号:
test@kickseed:~$ a=3
test@kickseed:~$ b=2
test@kickseed:~$ m="a+ b "
test@kickseed:~$ echo $m
5
直接执行declare -i 命令可以查看已经定义的×××变量
test@kickseed:~$ declare -i
……
declare -ir UID="1000"
declare -i a="8"
declare -i d="10"
declare -i m="6"
declare -i n="4"
使用declare -i 命令声明变量后还可以用不同进制的数字表示十进制数
第一种写法:
test@kickseed:~$ declare -i m
test@kickseed:~$ m=2#101
test@kickseed:~$ echo $m
5
test@kickseed:~$ m=8#17
test@kickseed:~$ echo $m
15
test@kickseed:~$ m=16#b
test@kickseed:~$ echo $m
11
第二种写法:
test@kickseed:~$ declare -i n=017 其中017中的0代表八进制
test@kickseed:~$ echo $n
15
3、let: let是bash shell的一个内建命令。可以help let查看帮助
test@kickseed:~$ i=5
test@kickseed:~$ let i=i+1
test@kickseed:~$ echo $i
6
test@kickseed:~$ let "i = i + 2"
test@kickseed:~$ echo $i
8
需要注意的是: 使用let时,如果运算表达式没有使用双引号,则表达式之间不能有空格;如果使用了双引号,则表达式之间可以有空格。
建议使用双引号。
4、(( )) :let也可以用(( ))替换
test@kickseed:~$ i=3
test@kickseed:~$ ((i+=2))
test@kickseed:~$ echo $i
5
test@kickseed:~$ (( i+= 2))
test@kickseed:~$ echo $i
7
test@kickseed:~$ (( "i+= 2" ))
test@kickseed:~$ echo $i
9
(( ))还可以直接一步出结果,有无空格无影响。双括号中不可以使用变量
souche@kickseed:~$ i=2
souche@kickseed:~$ echo $((i+= 3 ))
5
5、$[ ] 中括号中有无空格无影响。中括号中可以使用变量
test@kickseed:~$ var=$[1+ 2 ]
test@kickseed:~$ echo $var
3
test@kickseed:~$ echo $[3+2]
5
test@kickseed:~$ m=2
test@kickseed:~$ echo $[$m +1 ]
3
常见运算符号:
let使用双引号时支持:
+ - * / % >> << & ^ | > < = 以及这些符号与=号结合的符号。并且还支持 == 和 !=。即支持上述图中常见运算符
test@kickseed:~$ echo $m $n
7 2
test@kickseed:~$ let "c=m==n"
test@kickseed:~$ echo $c
0
test@kickseed:~$ let "c=m!=n"
test@kickseed:~$ echo $c
1
souche@kickseed:~$ let "c=(3>2) || (4<= 1 )"
souche@kickseed:~$ echo $c
1
souche@kickseed:~$ let "c=(3>2) && (4<= 1 )"
souche@kickseed:~$ echo $c
0
souche@kickseed:~$ let "c=(3<2) || (4<= 1 )"
souche@kickseed:~$ echo $c
0
(( ))等同于let
$[] 支持
+ - * / % >> << & ^ | > < = 以及这些符号与=号结合的符号。并且还支持 == 和 !=。即支持上述图中常见运算符
souche@kickseed:~$ echo $[(3<2) || (4<= 1 )]
0
souche@kickseed:~$ echo $[(3>2) || (4<= 1 )]
1
declare -i声明整型变量后,需要使用双引号支持。
+ - * / % >> << & ^ | > < = 以及这些符号与=号结合的符号。并且还支持 == 和 !=。即支持上述图中常见运算符
souche@kickseed:~$ declare -i m
souche@kickseed:~$ m="(3>2) || (4<= 1 )"
souche@kickseed:~$ echo $m
1
souche@kickseed:~$ m="(3<2) || (4<= 1 )"
souche@kickseed:~$ echo $m
0
总结:
1、declare -i声明整型变量后,变量运算最好使用双引号。
2、let 进行算术运算最好也使用双引号。
3、(()) 等同于let,不需要使用双引号
4、$[] 不需要使用双引号
上面4中算术运算辅助符,按照总结的使用说明时,在双引号和括号中的表达式有无空格都无影响,最好统一不带空格。
都支持:+ - * / % >> << & ^ | > < = 以及这些符号与=号结合的符号。并且还支持 == 和 !=。即支持上述图中常见运算符
ZD,,,: 你好,如果是落在了左尾附近呢?也是很少出现,但是P就会是0.99多,这样要接受原假设吗
初见wk: function userLoginMessageExport(obj){ var formData = $("#pagerForm[name='transRateCountForm']").serialize(); var href="${pageContext.request.contextPath}/userlogin/export?"+formData; $(obj).attr("href" , href); return true;
BaridYao: 我这么操作为什么不行呢
BaridYao: [code=cpp] public unsafe int GetDevRealStatusInfo(int ChannelID, void* Msg, uint MsgLen) { DsDevStatusInfo l_Msg = (DsDevStatusInfo)Marshal.PtrToStructure(Msg, typeof(DsDevStatusInfo)); return 0; } [/code]