一.算數(shù)運(yùn)算符
1.執(zhí)行算數(shù)就需要運(yùn)算符,shell與其它編程一樣也有很多算數(shù)運(yùn)算符悲关,常見的運(yùn)算符如下:
2.上表中的運(yùn)算符均適用于linux中shell的運(yùn)算命令谎僻,常見的運(yùn)算命令如下:
2.1擴(kuò)展運(yùn)算符
算數(shù)擴(kuò)展可以對算數(shù)表達(dá)式求值并替換所求的值。格式如下:
$[expression]
#樣例:
i=$[i+1]
echo $[i+1] #
$((expression))
#樣例:
((i=i+1))
i=$((i+1))
echo $((i+1))
((8>7 && 5==5))
注意:算數(shù)擴(kuò)展中的運(yùn)算數(shù)只能是整數(shù)寓辱,算數(shù)擴(kuò)展是不能對浮點(diǎn)數(shù)進(jìn)行算數(shù)運(yùn)算艘绍。
$[]運(yùn)算舉例
#常規(guī)運(yùn)算
[root@m01 ~]# echo $[1+10]
11
[root@m01 ~]# echo $[1-10]
-9
[root@m01 ~]# echo $[1*10]
10
[root@m01 ~]# echo $[1/10]
0
[root@m01 ~]# echo $[1%10]
1
[root@m01 ~]# echo $[10/10]
1
#定義變量求職
[roo[root@m01 ~]# i=1
[root@m01 ~]# echo $[i+1]
2
[root@m01 ~]# i=6
[root@m01 ~]# i=$[i+6]
[root@m01 ~]# echo $i
12
[root@m01 ~]# a=1
[root@m01 ~]# b=2
[root@m01 ~]# echo $[$a+$b]
3
[root@m01 ~]# echo $[a+b]
3
[root@m01 ~]# sum=$[$a+$b]
[root@m01 ~]# echo $sum
3
[root@m01 ~]# sum=$[a+b]
[root@m01 ~]# echo $sum
3
注意:這里應(yīng)用變量符$是可以省略
$(())運(yùn)算舉例
#常規(guī)運(yùn)算
[root@m01 ~]# echo $((6+6))
12
[root@m01 ~]# echo $((6-6))
0
[root@m01 ~]# echo $((6/6))
1
[root@m01 ~]# echo $((6*6))
36
[root@m01 ~]# echo $((6**6))
46656
[root@m01 ~]# echo $((6%6))
0
#定義變量求職與求值替換
[root@m01 ~]# a=1
[root@m01 ~]# echo $((a+1))
2
[root@m01 ~]# ((a=a+1))
[root@m01 ~]# echo $a
2
[root@m01 ~]# a=$((a+1))
[root@m01 ~]# echo $a
3
[root@m01 ~]# a=1
[root@m01 ~]# b=2
[root@m01 ~]# echo $(($a+$b))
3
[root@m01 ~]# echo $((a+b))
3
[root@m01 ~]# ((sum=$a+$b))
[root@m01 ~]# echo $sum
3
[root@m01 ~]# ((sum=a+b))
[root@m01 ~]# echo $sum
3
[root@m01 ~]# sum=$(($a+$b))
[root@m01 ~]# echo $sum
3
[root@m01 ~]# sum=$((a+b))
[root@m01 ~]# echo $sum
3
注意:這里應(yīng)用變量符$是可以省略
2.2運(yùn)算命令expr
expr命令可以實(shí)現(xiàn)數(shù)值運(yùn)算、數(shù)值或字符串比較秫筏、字符串匹配诱鞠、字符串提取、字符串長度計(jì)算等功能这敬。使用expr是判斷變量或參數(shù)是否為整數(shù)航夺、是否為空、是否為0等崔涂。
使用expr注意事項(xiàng):
1.運(yùn)算符及用于計(jì)算的數(shù)字左右都至少有一個(gè)空格阳掐,否則會(huì)報(bào)錯(cuò)。
2.使用乘號(hào)時(shí),必須用反斜線屏蔽其特定含義缭保,因?yàn)閟hell會(huì) 不識(shí)別*的含義汛闸。
expr整數(shù)運(yùn)算
#常規(guī)運(yùn)算
[root@m01 ~]# expr 1 + 2
3
[root@m01 ~]# expr 1 - 2
-1
[root@m01 ~]# expr 1 \* 2
2
[root@m01 ~]# expr 1 / 2
0
[root@m01 ~]# expr 1 % 2
1
#定義變量運(yùn)算
[root@m01 ~]# a=1
[root@m01 ~]# expr $a + 1
2
[root@m01 ~]# b=2
[root@m01 ~]# expr $a + $b
3
#錯(cuò)誤操作樣例如下
[root@m01 ~]# expr 1 ** 2
expr: syntax error
[root@m01 ~]# expr 1 +2
expr: syntax error
[root@m01 ~]# expr 1+2
1+2
[root@m01 ~]# expr 1+ 2
expr: syntax error
[root@m01 ~]# expr 1 + 2.5
expr: non-integer argument
使用expr判斷是否是整數(shù)
[root@m01 ~]# num1=1
[root@m01 ~]# num2=1.5
[root@m01 ~]# expr $num1 + 1 &>/dev/null
[root@m01 ~]# [ $? -ne 0 ] && echo "你輸入的事非整 數(shù)" || echo "你輸入的是整數(shù)"
你輸入的是整數(shù)
[root@m01 ~]# expr $num2 + 1 &>/dev/null
[root@m01 ~]# [ $? -ne 0 ] && echo "你輸入的事非整 數(shù)" || echo "你輸入的是整數(shù)"
你輸入的事非整數(shù)
說明:ne表示不等于為真
使用expr計(jì)算字符串長度
[root@m01 ~]# char="wei ai xiong"
[root@m01 ~]# expr length "$char"
12
#其他獲取字符串長度示例
[root@m01 ~]# echo ${#char}
12
[root@m01 ~]# echo $char|wc -L
12
[root@m01 ~]# echo $char|awk '{print length($0)}'
12
2.3運(yùn)算命令let
let運(yùn)算命令的語法格式為:let賦值表達(dá)式
let賦值表達(dá)式的功能等同于“((賦值表達(dá)式))”
let常規(guī)運(yùn)算
[root@m01 ~]# let sum=10+10
[root@m01 ~]# echo $sum
20
[root@m01 ~]# num1=100
[root@m01 ~]# num2=50
[root@m01 ~]# let sum=$num1+$num2
[root@m01 ~]# echo $sum
150
[root@m01 ~]# let sum=$num1*$num2
[root@m01 ~]# echo $sum
5000
[root@m01 ~]# let sum=$num1/$num2
[root@m01 ~]# echo $sum
2
[root@m01 ~]# let sum=$num1-$num2
[root@m01 ~]# echo $sum
50
let實(shí)現(xiàn)自增自減
[root@m01 ~]# a=1
[root@m01 ~]# let a++
[root@m01 ~]# echo $a
2
[root@m01 ~]# let a--
[root@m01 ~]# echo $a
1
2.4小數(shù)運(yùn)算bc、awk
運(yùn)算命令bc
#bc是unix/linux下的計(jì)算器艺骂,但是bc需要下載诸老。
[root@m01 ~]# yum -y install bc
[root@m01 ~]# num1=10
[root@m01 ~]# num2=20
[root@m01 ~]# echo $num1+$num2|bc
30
[root@m01 ~]# echo $num1-$num2|bc
-10
[root@m01 ~]# echo $num1*$num2|bc
200
[root@m01 ~]# echo $num1/$num2|bc
0
[root@m01 ~]# echo "scale=2;$num1/$num2"|bc#指定小數(shù)的位數(shù)
.50
[root@m01 ~]# echo $num1^$num2|bc
100000000000000000000
[root@m01 ~]# echo $num1%$num2|bc
10
awk
[root@m01 ~]# num1=10
[root@m01 ~]# num2=20
[root@m01 ~]# awk "BEGIN{print $num1+$num2}"
30
[root@m01 ~]# awk "BEGIN{print $num1-$num2}"
-10
[root@m01 ~]# awk "BEGIN{print $num1*$num2}"
200
[root@m01 ~]# awk "BEGIN{print $num1/$num2}"
0.5
[root@m01 ~]# awk 'BEGIN{printf "%.2f\n",1/2}'#取小數(shù)位數(shù)
0.50
[root@m01 ~]# awk "BEGIN{print $num1 ^ $num2 }"
100000000000000000000
[root@m01 ~]# awk "BEGIN{print $num1 % $num2 }"
10
[root@m01 ~]# echo "1 2"|awk '{print ($1-$2)}'
-1
#awk自定義內(nèi)部變量
[root@m01 ~]# awk -va=10 -vb=20 'BEGIN{print a ^ b}'
100000000000000000000
2.5自增自減運(yùn)算符
自增自減操作符主要包括前置自增(++variable)、前置自減(--variable)钳恕、后置自增(variable++)和后置自減(variable--)孕锄。
前置操作首先改變變量的值(++用于給變量加1,--用于給變量減1)苞尝,然后在將改變的變量值給表達(dá)式使用。后置變量則是在表達(dá)式使用后再改變變量的值宦芦。
要特別注意自增自減操作符的操作元只能是變量宙址,不能是常數(shù)或表達(dá)式,且該變量值必須為整數(shù)调卑,例如:++1抡砂、(
num+2)、++都是不合法恬涧。
二.條件測試以及條件測試操作
1.條件測試
條件測試可以根據(jù)某個(gè)特定條件是否滿足注益,來選擇執(zhí)行響應(yīng)的任務(wù)。在bash的各種條件結(jié)構(gòu)和流程控制結(jié)構(gòu)中都要進(jìn)行各種測試溯捆,然后根據(jù)測試結(jié)果執(zhí)行不同的操作丑搔,有時(shí)也會(huì)與if等條件語句結(jié)合來完成測試判斷,以減少程序運(yùn)行的錯(cuò)誤提揍。bash中允許測試兩種類型的條件:
1.命令成功或失敗
2.表達(dá)式為真或假
任何一種測試中啤月,都要有退出狀態(tài)(返回值),退出狀態(tài)為0表示成功或表達(dá)式為真劳跃,非0則表示命令失敗或表達(dá)式為假谎仲。
條件表達(dá)式常用的語法
1.1test與條件測試語句
test命令在shell中主要用于條件測試,如果條件為真刨仑,則返回一個(gè)0值郑诺。如果表達(dá)式不為真,則返回一個(gè)大于0的值杉武,也可以將其稱為假值辙诞。test命令支持測試的范圍包括:字符串比較,算術(shù)比較轻抱,文件是否存在倘要,文件屬性,類型等判斷。例如封拧,判斷文件是否為空志鹃、文件是否存在、是否是目錄泽西、變量是否大于3曹铃、字符串是否等于"wei ai xiong"、字符串是否為空等等捧杉。在shell中陕见,幾乎所有的判斷都使用test命令實(shí)現(xiàn)。
實(shí)際shell編程中味抖,我們使用test命令并不多评甜,更多使用的是單括號(hào)[]和雙括號(hào)[[]],這里的test完全等價(jià)于[],只是寫法不同仔涩。
test條件測試的語法格式是:test<測試表達(dá)式>
[](中括號(hào))條件測試的語法格式為:[<測試表達(dá)式>]
示例如下:
#test示例
[root@m01 ~]# x=1;y=2
[root@m01 ~]# test $x -gt $y #gt表示大于
[root@m01 ~]# echo $?
1
[root@m01 ~]# test $x -lt $y #lt表示小于
[root@m01 ~]# echo $?
0
#用方括號(hào)[]代替test
[root@m01 ~]# [ $x -lt $y ]
[root@m01 ~]# echo $?
0
[root@m01 ~]# [ $x -gt $y ]
[root@m01 ~]# echo $?
1
注意:方括號(hào)[]的兩端都要留空格忍坷!不然shell會(huì)報(bào)錯(cuò),這不是書寫建議熔脂,而是強(qiáng)制要求的格式
1.2雙方括號(hào)([[]])測試表達(dá)式
[[]]基本等于[]佩研,但是有些功能寫法更簡潔,且[[]]提供了[]所不具備的正則表達(dá)式匹配霞揉。所以旬薯,[[]]的功能可以認(rèn)為是[]和expr命令相加。
語法格式:[[<測試表達(dá)式>]]
同樣這里的雙括號(hào)的兩端都需要有空格适秩,在[[]]中可以使用通配符等驚醒匹配绊序;并且&&、||秽荞、>政模、<等操作符可以應(yīng)用在[[]]中,但不能應(yīng)用于[]中蚂会,在[]中一般使用-a淋样、-o、-gt(大于)胁住、-lt(小于)等操作符代替上文提到到用到的[[]]中的符號(hào)趁猴。
#對比測試如下
[root@m01 ~]# name=Tom
[root@m01 ~]# [ $name = [Tt]?? ]
[root@m01 ~]# echo $?
1
[root@m01 ~]# [[ $name = [Tt]?? ]]
[root@m01 ~]# echo $?
0
1.3雙小括號(hào)(())測試表達(dá)式
(())條件測試的語法格式為:((<測試表達(dá)式>))
這里不再論述其他用法,注意:(())中不能使用類似-eq等語法彪见。
2.測試操作符
2.1字符串測試操作符
字符串測試操作符的作用有:比較兩個(gè)字符串是否相同儡司、字符串的長度是否為零、字符串是否為NULL等余指。
字符串比較必須使用雙引號(hào)
測試舉例如下:
[ "name" = "name" ]
[ "name" != "name" ]
[root@web ~]# [ "$USER" = "root" ]
[root@web ~]# echo $USER
root
[root@web ~]# [ "$USER" = "root" ]
[root@web ~]# echo $?
0
[root@web ~]# [ "$USER" = "tom" ]
[root@web ~]# echo $?
1
[root@web ~]# [ "$USER" != "tom" ]
[root@web ~]# echo $?
0
-z -n
[root@web ~]# name=""
[root@web ~]# [ -z $name ]
[root@web ~]# echo $?
0
[root@web ~]# [ ! -z $name ]
[root@web ~]# echo $?
1
[root@web ~]# name="alex"
[root@web ~]# [ -z $name ]
[root@web ~]# echo $?
1
[root@web ~]# [ -n $name ]
[root@web ~]# echo $?
0
#正則比對
[[]]
[root@web01 scripts]# [ "$USER" = "root" ]
[root@web01 scripts]# echo $?
0
[root@web01 scripts]# [[ "$USER" =~ ^r ]]
[root@web01 scripts]# echo $?
0
[root@web01 scripts]# [[ "$USER" =~ t$ ]]
[root@web01 scripts]# echo $?
0
[root@web01 scripts]# [[ ! "$USER" =~ t$ ]]
[root@web01 scripts]# echo $?
1
2.2文件測試操作符
文件測試操作符是用來測試文件是否存在捕犬、文件屬性跷坝、訪問權(quán)限等場景,下表為常用的的操作符碉碉。
測試舉例
[root@web01 scripts]# [ -f /etc/hosts ] && echo 為真 || echo 為假
為真
[root@web01 scripts]# [ -f /etc/hostsss ] && echo 為真 || echo 為假
為假
[root@web01 scripts]# [ -d /etc/hosts ] && echo 為真 || echo 為假
為假
[root@web01 scripts]# [ ! -d /etc/hosts ] && echo 為真 || echo 為假
為真
[root@web01 scripts]# [ -e /etc/hosts ] && echo 為真 || echo 為假
為真
[root@web01 scripts]# [ -e /etc/ ] && echo 為真 || echo 為假
為真
[root@web01 scripts]# [ -r /etc/ ] && echo 為真 || echo 為假
為真
[root@web01 scripts]# [ -w /etc/ ] && echo 為真 || echo 為假
為真
[root@web01 scripts]# [ -x /etc/ ] && echo 為真 || echo 為假
為真
[root@web01 scripts]# [ -x /etc/hosts ] && echo 為真 || echo 為假
[root@web01 scripts]# [ -x /etc/hosts ] && echo 為真 || echo 為假
為假
[root@web01 scripts]# [ -x /etc/hosts ] && echo 為真 || echo 為假
為假
2.3整數(shù)二元比較操作符測試操作
整數(shù)測試柴钻,即比較大小。在shell編程中使用最多垢粮,首先看一下常用的整數(shù)測試操作符:
舉例測試
[root@web01 scripts]# [ 10 -eq 10 ] && echo ok || echo error
ok
[root@web01 scripts]# [ 10 -gt 10 ] && echo ok || echo error
error
[root@web01 scripts]# [ 10 -ge 10 ] && echo ok || echo error
ok
[root@web01 scripts]# [ 10 -ne 10 ] && echo ok || echo error
error
[root@web01 scripts]# [ 10 -lt 10 ] && echo ok || echo error
error
[root@web01 scripts]# [ 10 -le 10 ] && echo ok || echo error
ok
2.4邏輯操作符
邏輯測試操作符主要包括邏輯非贴届、邏輯與、邏輯或運(yùn)算符蜡吧,具體如下表:
舉例如下
[root@web01 scripts]# [ 10 -eq 10 -a 100 -ne 100 ]
[root@web01 scripts]# echo $?
1
[root@web01 scripts]# [ 10 -eq 10 -a 100 -eq 100 ]
[root@web01 scripts]# echo $?
0
[root@web01 scripts]# [ 10 -eq 10 -o 100 -ne 100 ]
[root@web01 scripts]# echo $?
0
[root@web01 scripts]# [[ 10 -eq 10 && 100 -ne 100 ]]
[root@web01 scripts]# [[ 10 -eq 10 -a 100 -ne 100 ]]
-bash: 條件表達(dá)式中有語法錯(cuò)誤
-bash: `-a' 附近有語法錯(cuò)誤
[root@web01 scripts]# [[ 10 -eq 10 && 100 -ne 100 ]]
[root@web01 scripts]# echo $?
1
[root@web01 scripts]# [[ 10 -eq 10 || 100 -ne 100 ]]
[root@web01 scripts]# echo $?
0