«

Shell基础教程03 运算

Linux-man.cn 发布于 阅读:19 技术文章


shell的运算和其他语言有很大不同

(我们暂时只了解这些运算符的基本用法,方便展开讨论后面的内容,高级应用以后穿插着介绍)

数学运算

先看栗子:

ss@ANDROID:~$ let n=3+1              # 加法
ss@ANDROID:~$ i=$[3-1]                 # 减法
ss@ANDROID:~$ j=$((3*2))              # 乘法,等价于$[]形式。
ss@ANDROID:~$ k=$(expr 3 / 2)      # 除法,运算符两边必须使用空格分隔。
ss@ANDROID:~$ ((m=3%2))            # 取模,等价于$()形式

这里我就不echo出变量的值了,你试着echo下会不会发现有些值和预想中的不同?是的,虽然shell内置了对整数四则运算的支持,但是并不支持浮点运算,要做精密计算可以使用bc命令。

ss@ANDROID:~$ echo 3.1415926 * 2.1 | bc
6.5973444
ss@ANDROID:~$

上面有个陌生的符号——“|”,在Linux中叫做管道符,它的作用是将上一个命令的输出给下一个命令的输入。通过管道符就能将文本流串联起来,Linux有个设计哲学:一个命令只做一件事,并把事情做好,通过管道符将各个命令组合起来完成复杂的任务。

判断

数值判断:

ss@ANDROID:~$ [[ 3 -eq 2 ]]       # 等于
ss@ANDROID:~$ echo $?
1
ss@ANDROID:~$ [[ 3 -ne 2 ]]       # 不等于
ss@ANDROID:~$ echo $?
0
ss@ANDROID:~$ [[ 3 -gt 2 ]]        # 大于
ss@ANDROID:~$ echo $?
0
ss@ANDROID:~$ [[ 3 -lt 2 ]]         # 小于
ss@ANDROID:~$ echo $?
1
ss@ANDROID:~$ [[ 3 -le 2 ]]        # 小于等于
ss@ANDROID:~$ echo $?
1
ss@ANDROID:~$ [[ 3 -ge 2 ]]       # 大于等于
ss@ANDROID:~$ echo $?
0

字符串判断:

ss@ANDROID:~$ [[ "3" == "2" ]]       # 等于
ss@ANDROID:~$ echo $?
1
ss@ANDROID:~$ [[ "3" != "2" ]]        # 不等于
ss@ANDROID:~$ echo $?
0
ss@ANDROID:~$ [[ -z "" ]]                # 字符串为空
ss@ANDROID:~$ echo $?
0
ss@ANDROID:~$ [[ -n "" ]]                # 字符串不为空
ss@ANDROID:~$ echo $?
1
ss@ANDROID:~$

shell的判断感觉怪怪的,数字判断用英文字符,字符串判断用数学运算符。那既然是“祖师爷”他们定的规矩就照做吧。上文中的0和1是命令的退出状态码,0表示正常,1以上的表示不正常,而获取上一条命令的退出状态码则用“$?”。

“[[ ]]" 可以用 "[ ]" 替代,"[ ]" 可以用test命令替代:

ss@ANDROID:~$ test 3 -ge 2
ss@ANDROID:~$ echo $?
0
ss@ANDROID:~$

但是建议使用"[[ ]]",暂时不要问为什么哈。另外”[[ ]]“里组成的每个元素需要用空格分隔。

逻辑运算

"-a"、"-o"用在"[[ ]]"里面,”&&“、”||"用在多个"[[ ]]"之间。"!"里外都可以。

总结

bash linux shell 运算