linux shell 腳本-基礎(chǔ)知識(二)

條件測試和判斷語句

在shell 中雨让,用戶可以使用測試語句來測試指定的條件表達(dá)式的條件的真或者假。當(dāng)指定的條件為真時(shí)蝗罗,整個(gè)條件測試的返回值為0艇棕;反之蝌戒,如果指定的條件為假,則條件測試語句的返回值為非0值沼琉。

條件測試的語法有兩種北苟,分別是test和[命令,下面分別來講解它們的語法:
1)test
test 語法如下:

test expression

參數(shù)expression表示需要測試的條件表達(dá)式打瘪,可以由字符串友鼻、整數(shù)、文件名闺骚,以及各種運(yùn)算符組成彩扔。

2)[
test 命令相同,[ 命令的作用也是對后面的條件表達(dá)式進(jìn)行測試僻爽,但是為了增加程序的可讀性虫碉,shell要求在表達(dá)式后面追加一個(gè)右方括號 ] 來與前面的 [ 命令配對。語法如下:

[ expression ]

[是命令胸梆,expression 是條件表達(dá)式敦捧。條件表達(dá)式和左右方括號之間都必須有一個(gè)空格须板。

左方括號 [ 是一個(gè)shell命令,而非條件表達(dá)式的一部分兢卵。
而命令與參數(shù)之間必須保留一個(gè)空格习瑰。
所以,在上面的語法中秽荤,expression與左右括號都需保留一個(gè)空格甜奄。

字符串測試

shell中,可以通過5種運(yùn)算符來對字符串進(jìn)行操作窃款。

字符串運(yùn)算符

運(yùn)算符 說明
string 判斷指定的字符串是否為空
string1 = string2 判斷兩個(gè)字符串是否相等
string1 != string2 判斷兩個(gè)字符串是否不相等
-n string 判斷字符串是否非空串
-z string 判斷字符串是夠?yàn)榭沾?/td>

對于字符串測試應(yīng)該基本了解贺嫂,但應(yīng)注意以下兩點(diǎn):

  • 在給變量賦值的時(shí)候,等號"="左右兩邊一定不要有空格雁乡;否則第喳,shell會(huì)把空格前面的字符串當(dāng)作shell命令
  • 在測試運(yùn)算符"="、"!="踱稍、及"-z"等符號的左右兩邊曲饱,一定含有空格

整數(shù)測試

整數(shù)測試的語法形式為:

[ number1 op number2 ]
運(yùn)算符 說明
number1 -eq number2 比較number1 和number2是否相等。如果相等珠月,測試結(jié)果為0
number1 -ne number2 比較number1 和number2是否不相等扩淀。如果不相等,測試結(jié)果為0
number1 -gt number2 比較number1是否大于number2啤挎。如果大于驻谆,測試結(jié)果為0
number1 -lt number2 比較number1是否小于number2。如果小于庆聘,測試結(jié)果為0
number1 -ge number2 比較number1 是否大于等于number2胜臊。如果大于等于,測試結(jié)果為0
number1 -le number2 比較number1是否小于等于number2伙判。如果小于等于象对,測試結(jié)果為0

字符串運(yùn)算符和整數(shù)運(yùn)算符不可以混用。

[root@VM_16_3_centos base]$ x=12.3 
[root@VM_16_3_centos base]$ y=12 
[root@VM_16_3_centos base]$ [ "$x" -gt "$y" ]
-bash: [: 12.3: integer expression expected

文件測試

[ op file ]
操 作 符 說明
-a file 文件是否存在宴抚。如果file存在勒魔,則結(jié)果為0
-b file 文件是否存在,且為塊文件菇曲。如果file是一個(gè)已經(jīng)存在的塊文件冠绢,則結(jié)果為0
-c file 文件是否存在,且為字符文件常潮。如果file是一個(gè)已經(jīng)存在的字符文件弟胀,則結(jié)果為0
-d file 文件是否存在,且為目錄。如果file是一個(gè)已經(jīng)存在的目錄邮利,則結(jié)果為0
-e file 同-a操作符
-s file 文件的長度是否大于0或者文件為非空文件弥雹。如果file是一個(gè)非空文件,則結(jié)果為0
-f file 文件存在延届,且為常規(guī)文件剪勿。如果file是一個(gè)已經(jīng)存在的常規(guī)文件,則結(jié)果為0
-w file 文件是否存在且可寫方庭。如果文件按是一個(gè)可寫文件則結(jié)果為0
?L file 文件是否存在厕吉,且為符號鏈接。如果file是一個(gè)已經(jīng)存在的符號鏈接械念,則結(jié)果為0
?u file 文件是否設(shè)置suid位头朱。如果file已經(jīng)設(shè)置了suid位,則結(jié)果為0
?r file 文件是否存在且可讀龄减。如果文件按是一個(gè)可讀文件則結(jié)果為0
?x file 文件是否存在且可執(zhí)行项钮。如果文件按是一個(gè)可執(zhí)行文件則結(jié)果為0

邏輯操作符

操作符 說明
!expression 邏輯非,條件表達(dá)式expression的值為假希停,則該操作符的運(yùn)算結(jié)果為真
expression1 -a expression2 邏輯與烁巫,條件表達(dá)式expression1和expression2的值都是真時(shí),整個(gè)表達(dá)式的值才為真
expression1 ?o expression2 邏輯或宠能,條件表達(dá)式 expression1或者expression2的值有一個(gè)為真時(shí)亚隙,整個(gè)表達(dá)式的值就為真

條件判斷語句

1.使用簡單的if語句進(jìn)行判斷

if expression
then
    statement
    statement
fi

例4:通過條件測試判斷某些文件的類型

#!/bin/bash

# 通過條件測試判斷/bin/bash 文件是否存在
if [ -a /bin/bash ]
then
    echo "/bin/bash exist!"
fi

結(jié)果為

[root@VM_16_3_centos if_test]$ sh if.sh 
/bin/bash exist!

例5:使用空命令作為判斷條件

#! /bin/bash

if :; 
then
    echo "always true"; 
fi

空命令":"的退出狀態(tài)永遠(yuǎn)為0,因此會(huì)輸出 always true违崇。

例6:使用&&代替 if 語句進(jìn)行判斷

#! /bi/bash

test "$whoami" != "root" && (echo you are using a non-privileged account; exit 1)

該判斷語句首先對當(dāng)前用戶進(jìn)行判斷阿弃,如果當(dāng)前用戶不為root,也即為真則輸出后面的說明語句羞延。

2.使用if else 語句進(jìn)行流程控制

if expression 
then 
    statement1
    statement2
    ..
else 
    statement3
    statement4
    ..
fi

3.使用if elif進(jìn)行多條件判斷

if expression
then 
    statement1
    statement2
    ..
elif expression
then
    statement3
    statement4
    ..
else
    statement5
    ..
fi

4.使用exit語句退出程序

exit status

status參數(shù)表示退出狀態(tài)渣淳,該參數(shù)是一個(gè)整數(shù)值,其取值范圍為0~255肴楷;

按照慣例水由,退出狀態(tài)0意味著腳本成功運(yùn)行完畢荠呐;而非0通常意味著程序執(zhí)行過程中出現(xiàn)某些錯(cuò)誤赛蔫。
因此,用戶可以用其它的非0值來給父進(jìn)程傳遞不同的消息泥张,根據(jù)子進(jìn)程的成功或者失敗呵恢,父進(jìn)程采取不同的措施,如果沒有參數(shù)給語句媚创,那么由exit語句之前的那條語句的執(zhí)行狀態(tài)來決定渗钉。

5.多條件判斷語句case

case語句基本語法:

case variable in
value1)
    statement1
    statement2
    ..
    statementn;;
value2)
    statement1
    statement2
    ..
    statementn;;
...
valuen)
    statement1
    statement2
    ..
    statementn;;
#其它情況
*)
    statement1
    statement2
    ..
    statementn;;
#相當(dāng)于if 結(jié)尾fi
esac

6.利用case語句處理用戶輸入

例7:說明case語句的使用方法

#! /bin/bash

echo "Hit a key, then hit return."
#讀取用戶按下的鍵
read keypress
#case語句開始
case "$keypress" in
    #小寫字母
    [[:lower:]])
        echo "Lowercase letter.";;
    [[:upper:]])
        echo "Uppercase letter.";;
    [0-9])
        echo "Digit.";;
    *)
        echo "other letter.";;
esac

7.運(yùn)算符

1.使用expr外部程序
#!/bin/bash

#注意: 要用反引號括起來
result=`expr 2 - 100`
echo "result=${result}"
result=`expr 2-100`
echo "result=${result}"

result=`expr \( 2 - 6 \) \* 12`
echo "result=${result}"

result=`expr (2-6)*12`
echo "result=${result}"

結(jié)果為

[root@VM_16_3_centos if_test]$ sh expr.sh 
result=-98
result=2-100
result=-48
expr.sh: command substitution: line 12: syntax error near unexpected token `2-6'
expr.sh: command substitution: line 12: `expr (2-6)*12'
result=

使用expr命令時(shí)要注意運(yùn)算符左右兩邊的空格,同時(shí)需要將括號進(jìn)行轉(zhuǎn)義表示,括號兩邊也要注意空格

2.使用$((…))

例10:演示使用$((…))符號進(jìn)行算術(shù)運(yùn)算

#!/bin/bash

result=$(( 3+6 ))
echo "result= $result"

result=$(( (1-4) * 5 ))
echo "result= $result"
result= 9
result= -15
3.使用let命令

例11:演示使用let命令執(zhí)行算術(shù)運(yùn)算

#! /bin/bash

n=10
let n=n+1
echo "$n"
let n=n*10
echo "$n"
let n=n**2
echo "$n"
11
110
12100
4.使用位運(yùn)算符

例12:演示使用位運(yùn)算符的方法

#! /bin/bash

result=$[ 2 << 3 ]
echo "$result"
result=$[ 8>> 2 ]
echo "$result"
result=$[ 8 & 4 ]
echo "$result"
result=$[ ~8 ]
echo "$result"
result=$[ 10 ^ 6 ]
echo "$result"

結(jié)果為:

16
2
0
-9
12
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鳄橘,一起剝皮案震驚了整個(gè)濱河市声离,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘫怜,老刑警劉巖术徊,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鲸湃,居然都是意外死亡赠涮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進(jìn)店門暗挑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笋除,“玉大人,你說我怎么就攤上這事炸裆±” “怎么了?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵烹看,是天一觀的道長嗤瞎。 經(jīng)常有香客問我,道長听系,這世上最難降的妖魔是什么贝奇? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮靠胜,結(jié)果婚禮上掉瞳,老公的妹妹穿的比我還像新娘。我一直安慰自己浪漠,他們只是感情好陕习,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著址愿,像睡著了一般该镣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上响谓,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天损合,我揣著相機(jī)與錄音,去河邊找鬼娘纷。 笑死嫁审,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赖晶。 我是一名探鬼主播律适,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捂贿?” 一聲冷哼從身側(cè)響起纠修,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厂僧,沒想到半個(gè)月后分瘾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吁系,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年德召,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汽纤。...
    茶點(diǎn)故事閱讀 38,777評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡上岗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蕴坪,到底是詐尸還是另有隱情肴掷,我是刑警寧澤,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布背传,位于F島的核電站呆瞻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏径玖。R本人自食惡果不足惜痴脾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梳星。 院中可真熱鬧赞赖,春花似錦、人聲如沸冤灾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽韵吨。三九已至匿垄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間归粉,已是汗流浹背椿疗。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盏浇,地道東北人变丧。 一個(gè)月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像绢掰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 一滴劲、Python簡介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡介】: Python 是一個(gè)...
    _小老虎_閱讀 5,733評論 0 10
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,378評論 0 5
  • 字符串運(yùn)算符 運(yùn)算符 說明 string 判斷指定的字符串是否為空 string1 = string 2...
    Al_不期而遇閱讀 152評論 0 0
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時(shí)攻晒,會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,259評論 0 9
  • 黃昏里 彩霞燦爛了天邊 陽光斜照著 射出云層 似皮筋 拉得長長的 緊緊的 綁在樹上 拉著走 樹站在原地 留下長長的...
    杖劍走四方閱讀 146評論 0 8