W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
學(xué)習(xí)是一個(gè)登堂入室、由淺入深的過程。在學(xué)習(xí)完Linux命令、掌握Shell腳本語(yǔ)法變量和接收用戶輸入的信息之后,就要踏上新的高度—能夠進(jìn)一步處理接收到的用戶參數(shù)。
在本書前面章節(jié)中講到,系統(tǒng)在執(zhí)行mkdir命令時(shí)會(huì)判斷用戶輸入的信息,即判斷用戶指定的文件夾名稱是否已經(jīng)存在,如果存在則提示報(bào)錯(cuò);反之則自動(dòng)創(chuàng)建。Shell腳本中的條件測(cè)試語(yǔ)法可以判斷表達(dá)式是否成立,若條件成立則返回?cái)?shù)字0,否則便返回其他隨機(jī)數(shù)值。條件測(cè)試語(yǔ)法的執(zhí)行格式如圖4-16所示。切記,條件表達(dá)式兩邊均應(yīng)有一個(gè)空格。
圖4-16 條件測(cè)試語(yǔ)句的執(zhí)行格式
按照測(cè)試對(duì)象來劃分,條件測(cè)試語(yǔ)句可以分為4種:
文件測(cè)試語(yǔ)句;
邏輯測(cè)試語(yǔ)句;
整數(shù)值比較語(yǔ)句;
字符串比較語(yǔ)句。
文件測(cè)試即使用指定條件來判斷文件是否存在或權(quán)限是否滿足等情況的運(yùn)算符,具體的參數(shù)如表4-3所示。 表4-3 文件測(cè)試所用的參數(shù)
操作符 | 作用 |
---|---|
-d | 測(cè)試文件是否為目錄類型 |
-e | 測(cè)試文件是否存在 |
-f | 判斷是否為一般文件 |
-r | 測(cè)試當(dāng)前用戶是否有權(quán)限讀取 |
-w | 測(cè)試當(dāng)前用戶是否有權(quán)限寫入 |
-x | 測(cè)試當(dāng)前用戶是否有權(quán)限執(zhí)行 |
下面使用文件測(cè)試語(yǔ)句來判斷/etc/fstab是否為一個(gè)目錄類型的文件,然后通過Shell解釋器的內(nèi)設(shè)$?變量顯示上一條命令執(zhí)行后的返回值。如果返回值為0,則目錄存在;如果返回值為非零的值,則意味著目錄不存在:
[root@linuxprobe ~]# [ -d /etc/fstab ]
[root@linuxprobe ~]# echo $?
1
再使用文件測(cè)試語(yǔ)句來判斷/etc/fstab是否為一般文件,如果返回值為0,則代表文件存在,且為一般文件:
[root@linuxprobe ~]# [ -f /etc/fstab ]
[root@linuxprobe ~]# echo $?
0
邏輯語(yǔ)句用于對(duì)測(cè)試結(jié)果進(jìn)行邏輯分析,根據(jù)測(cè)試結(jié)果可實(shí)現(xiàn)不同的效果。例如在Shell終端中邏輯“與”的運(yùn)算符號(hào)是&&,它表示當(dāng)前面的命令執(zhí)行成功后才會(huì)執(zhí)行它后面的命令,因此可以用來判斷/dev/cdrom文件是否存在,若存在則輸出Exist字樣。
[root@linuxprobe ~]# [ -e /dev/cdrom ] && echo "Exist"
Exist
除了邏輯“與”外,還有邏輯“或”,它在Linux系統(tǒng)中的運(yùn)算符號(hào)為||,表示當(dāng)前面的命令執(zhí)行失敗后才會(huì)執(zhí)行它后面的命令,因此可以用來結(jié)合系統(tǒng)環(huán)境變量USER來判斷當(dāng)前登錄的用戶是否為非管理員身份:
[root@linuxprobe ~]# echo $USER
root
[root@linuxprobe ~]# [ $USER = root ] || echo "user"
[root@linuxprobe ~]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ [ $USER = root ] || echo "user"
user
第三種邏輯語(yǔ)句是“非”,在Linux系統(tǒng)中的運(yùn)算符號(hào)是一個(gè)嘆號(hào)(?。硎景褩l件測(cè)試中的判斷結(jié)果取相反值。也就是說,如果原本測(cè)試的結(jié)果是正確的,則將其變成錯(cuò)誤的;原本測(cè)試錯(cuò)誤的結(jié)果則將其變成正確的。
我們現(xiàn)在切換回到root管理員身份,再判斷當(dāng)前用戶是否為一個(gè)非管理員的用戶。由于判斷結(jié)果因?yàn)閮纱畏穸ǘ兂烧_,因此會(huì)正常地輸出預(yù)設(shè)信息:
[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe root]# [ $USER != root ] || echo "administrator"
administrator
就技術(shù)圖書的寫作來講,一般有兩種套路:讓讀者真正搞懂技術(shù)了;讓讀者覺得自己搞懂技術(shù)了。因此市面上很多淺顯的圖書會(huì)讓讀者在學(xué)完之后感覺進(jìn)步特別快,這基本上是作者有意為之,目的就是讓您覺得“圖書很有料,自己收獲很大”,但是在步入工作崗位后就露出短板吃大虧。所以劉遄老師決定繼續(xù)提高難度,為讀者增加一個(gè)綜合的示例,一方面作為前述知識(shí)的總結(jié),另一方面幫助讀者夯實(shí)基礎(chǔ),能夠在今后工作中更靈活地使用邏輯符號(hào)。
當(dāng)前我們正在登錄的即為管理員用戶—root。下面這個(gè)示例的執(zhí)行順序是,先判斷當(dāng)前登錄用戶的USER變量名稱是否等于root,然后用邏輯運(yùn)算符“非”進(jìn)行取反操作,效果就變成了判斷當(dāng)前登錄的用戶是否為非管理員用戶了。最后若條件成立則會(huì)根據(jù)邏輯“與”運(yùn)算符輸出user字樣;或條件不滿足則會(huì)通過邏輯“或”運(yùn)算符輸出root字樣,而如果前面的&&不成立才會(huì)執(zhí)行后面的||符號(hào)。
[root@linuxprobe ~]# [ $USER != root ] && echo "user" || echo "root"
root
整數(shù)比較運(yùn)算符僅是對(duì)數(shù)字的操作,不能將數(shù)字與字符串、文件等內(nèi)容一起操作,而且不能想當(dāng)然地使用日常生活中的等號(hào)、大于號(hào)、小于號(hào)等來判斷。因?yàn)榈忍?hào)與賦值命令符沖突,大于號(hào)和小于號(hào)分別與輸出重定向命令符和輸入重定向命令符沖突。因此一定要使用規(guī)范的整數(shù)比較運(yùn)算符來進(jìn)行操作??捎玫恼麛?shù)比較運(yùn)算符如表4-4所示。
表4-4 可用的整數(shù)比較運(yùn)算符
操作符 | 作用 |
---|---|
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否等于或小于 |
-ge | 是否大于或等于 |
接下來小試牛刀。我們先測(cè)試一下10是否大于10以及10是否等于10(通過輸出的返回值內(nèi)容來判斷):
[root@linuxprobe ~]# [ 10 -gt 10 ]
[root@linuxprobe ~]# echo $?
1
[root@linuxprobe ~]# [ 10 -eq 10 ]
[root@linuxprobe ~]# echo $?
0
在2.4節(jié)曾經(jīng)講過free命令,它可以用來獲取當(dāng)前系統(tǒng)正在使用及可用的內(nèi)存量信息。接下來先使用free -m命令查看內(nèi)存使用量情況(單位為MB),然后通過grep Mem:命令過濾出剩余內(nèi)存量的行,再用awk '{print $4}'命令只保留第四列,最后用FreeMem=語(yǔ)句
的方式把語(yǔ)句內(nèi)執(zhí)行的結(jié)果賦值給變量。
這個(gè)演示確實(shí)有些難度,但看懂后會(huì)覺得很有意思,沒準(zhǔn)在運(yùn)維工作中也會(huì)用得上。
[root@linuxprobe ~]# free -m
total used free shared buffers cached
Mem: 1826 1244 582 9 1 413
-/+ buffers/cache: 830 996
Swap: 2047 0 2047
[root@linuxprobe ~]# free -m | grep Mem:
Mem: 1826 1244 582 9
[root@linuxprobe ~]# free -m | grep Mem: | awk '{print $4}'
582
[root@linuxprobe ~]# FreeMem=`free -m | grep Mem: | awk '{print $4}'`
[root@linuxprobe ~]# echo $FreeMem
582
上面用于獲取內(nèi)存可用量的命令以及步驟可能有些“超綱”了,如果不能理解領(lǐng)會(huì)也不用擔(dān)心,接下來才是重點(diǎn)。我們使用整數(shù)運(yùn)算符來判斷內(nèi)存可用量的值是否小于1024,若小于則會(huì)提示“Insufficient Memory”(內(nèi)存不足)的字樣:
[root@linuxprobe ~]# [ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
Insufficient Memory
字符串比較語(yǔ)句用于判斷測(cè)試字符串是否為空值,或兩個(gè)字符串是否相同。它經(jīng)常用來判斷某個(gè)變量是否未被定義(即內(nèi)容為空值),理解起來也比較簡(jiǎn)單。字符串比較中常見的運(yùn)算符如表4-5所示。
表4-5 常見的字符串比較運(yùn)算符
操作符 | 作用 |
---|---|
= | 比較字符串內(nèi)容是否相同 |
!= | 比較字符串內(nèi)容是否不同 |
-z | 判斷字符串內(nèi)容是否為空 |
[root@linuxprobe ~]# [ -z $String ]
[root@linuxprobe ~]# echo $?
0
再嘗試引入邏輯運(yùn)算符來試一下。當(dāng)用于保存當(dāng)前語(yǔ)系的環(huán)境變量值LANG不是英語(yǔ)(en.US)時(shí),則會(huì)滿足邏輯測(cè)試條件并輸出“Not en.US”(非英語(yǔ))的字樣:
[root@linuxprobe ~]# echo $LANG
en_US.UTF-8
[root@linuxprobe ~]# [ $LANG != "en.US" ] && echo "Not en.US"
Not en.US
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: