菜鸟这几天学了Bash的一些东西,那些条件测试、算术运算什么的真令人头疼。What a headache!
So let's do a summary.
算术运算
Bash中做算术运算有N种方式。Unfortunately, Bash supports only integer!!!只支持整数,所以想用浮点什么的就用bc、awk什么的吧,这里就不说了。
还有,bash里有小数都是直接丢掉小数点后的,比如6/5=1。
一、((expression)) --> bash关键字
这个很简单,我也最喜欢这种,直接在括号里面写表达式就行了。比如:
1 $ (( C = 1 + 2 )) 2 $ echo $C 3 3
如果不在括号内赋值的话:
1 $ C=$(( 1 + 2 )) 2 $ echo $C 3 3
注意别忘了括号前的$,负责会报错。但括号里的空格可以省略,加上更好看。。。
更多:
1 $ (( 1 == 1 )) 2 $ echo $? 3 0 4 5 $ (( 1 == 2 )) 6 $ echo $? 7 1
1 $ C=1 2 $ (( C++ )) # 括号中引用变量不需要$,Bash会自动解析 3 $ echo $C 4 2 5 # 自增也支持,具体支持哪些操作符可以查看man手册
二、let --> shell built-in
let用法和上面的差不多,但后面的表达式不能有空格。For instance:
1 $ let C=1+2 # 也不需要加$ 2 $ echo $C 3 3 4 5 $ let C*=3 6 $ echo $C 7 9 8 9 10 $ let 1==1 11 $ echo $? 12 0 13 14 $ let 1==2 15 $ echo $? 16 1
三、expr --> 一个命令
它的参数必须有空格。
1 $ expr 1 + 1 2 2 3 4 $ expr 2 \* 3 # *需要转义 5 6 6 7 $ 1 == 1 8 1 9 10 $ 1 != 1 11 0 12 13 $ expr length hello # 还可以轻微操作字符串。。。 14 5
这个的逻辑运算好像和前两个不一样。这里是true:1,false:0,上面是true:0,false:1。
四、$[expression]
和let等效,快被弃用了('男人'说的)。总的来说推荐用第一种。
条件判断
一、test(或者说单方括号[ ])
1 $ test 1 == 1 或 [ 1 == 1 ] 2 $ echo $? 3 0 4 5 $ test 1 == 2 或 [ 1 == 2 ] 6 $ echo $? 7 1 8 9 $ STRING="hello" 10 $ test $STRING == 'hello' 或 [ $STRING == 'hello' ] 11 $ echo $? 12 0 13 $ [ $STRING != "hello" ] 14 $ echo $? 15 1 16 17 $ test -e /usr/bin/ping 或 [ -e /usr/bin/ping ] 18 $ echo $? 19 0
二、双方括号[[ ]]
$ [[ 1 == 1 ]] $ echo $? 0 $ [[ 1 == 2 ]] $ echo $? 1 $ [[ 1 -gt 2 ]] $ echo $? 1 $ STRING="hello" $ [[ $STRING == 'hello' ]] $ echo $? 0 $ [[ $STRING != "hello" ]] $ echo $? 1 $ [[ -e /usr/bin/ping ]] $ echo $? 0
可以看出两种方式差不多,但还是有区别的。
1 $ [ 1 == 1 ] && [ 2 == 2 ] 2 $ echo $? 3 0 4 5 $ [[ 1 == 1 && 2 == 2 ]] 6 $ echo $? 7 0 8 9 $ [ 1 == 1 ] && [ 2 == 3 ] 10 $ echo $? 11 1 12 13 $ [[ 1 == 1 && 2 == 3 ]] 14 $ echo $? 15 1
可见单括号是不支持逻辑运算符的。要在外面进行逻辑运算才行。
所以更喜欢双括号。
有错误请不吝赐教。