4.2.3 判斷用戶的參數(shù)

2023-05-11 14:47 更新

學(xué)習(xí)是一個登堂入室、由淺入深的過程。在學(xué)習(xí)完Linux命令、掌握Shell腳本語法變量和接收用戶輸入的信息之后,就要踏上新的高度—能夠進(jìn)一步處理接收到的用戶參數(shù)。

在本書前面章節(jié)中講到,系統(tǒng)在執(zhí)行mkdir命令時會判斷用戶輸入的信息,即判斷用戶指定的文件夾名稱是否已經(jīng)存在,如果存在則提示報錯;反之則自動創(chuàng)建。Shell腳本中的條件測試語法可以判斷表達(dá)式是否成立,若條件成立則返回數(shù)字0,否則便返回其他隨機(jī)數(shù)值。條件測試語法的執(zhí)行格式如圖4-16所示。切記,條件表達(dá)式兩邊均應(yīng)有一個空格。

圖4-16 條件測試語句的執(zhí)行格式

按照測試對象來劃分,條件測試語句可以分為4種:

文件測試語句;

邏輯測試語句;

整數(shù)值比較語句;

字符串比較語句。

文件測試即使用指定條件來判斷文件是否存在或權(quán)限是否滿足等情況的運(yùn)算符,具體的參數(shù)如表4-3所示。 表4-3 文件測試所用的參數(shù)

操作符 作用
-d 測試文件是否為目錄類型
-e 測試文件是否存在
-f 判斷是否為一般文件
-r 測試當(dāng)前用戶是否有權(quán)限讀取
-w 測試當(dāng)前用戶是否有權(quán)限寫入
-x 測試當(dāng)前用戶是否有權(quán)限執(zhí)行

下面使用文件測試語句來判斷/etc/fstab是否為一個目錄類型的文件,然后通過Shell解釋器的內(nèi)設(shè)$?變量顯示上一條命令執(zhí)行后的返回值。如果返回值為0,則目錄存在;如果返回值為非零的值,則意味著目錄不存在:

    [root@linuxprobe ~]# [ -d /etc/fstab ]
    [root@linuxprobe ~]# echo $?
    1

再使用文件測試語句來判斷/etc/fstab是否為一般文件,如果返回值為0,則代表文件存在,且為一般文件:

    [root@linuxprobe ~]# [ -f /etc/fstab ]
    [root@linuxprobe ~]# echo $?
    0

邏輯語句用于對測試結(jié)果進(jìn)行邏輯分析,根據(jù)測試結(jié)果可實(shí)現(xiàn)不同的效果。例如在Shell終端中邏輯“與”的運(yùn)算符號是&&,它表示當(dāng)前面的命令執(zhí)行成功后才會執(zhí)行它后面的命令,因此可以用來判斷/dev/cdrom文件是否存在,若存在則輸出Exist字樣。

    [root@linuxprobe ~]# [ -e /dev/cdrom ] && echo "Exist"
    Exist

除了邏輯“與”外,還有邏輯“或”,它在Linux系統(tǒng)中的運(yùn)算符號為||,表示當(dāng)前面的命令執(zhí)行失敗后才會執(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

第三種邏輯語句是“非”,在Linux系統(tǒng)中的運(yùn)算符號是一個嘆號(!),它表示把條件測試中的判斷結(jié)果取相反值。也就是說,如果原本測試的結(jié)果是正確的,則將其變成錯誤的;原本測試錯誤的結(jié)果則將其變成正確的。

我們現(xiàn)在切換回到root管理員身份,再判斷當(dāng)前用戶是否為一個非管理員的用戶。由于判斷結(jié)果因?yàn)閮纱畏穸ǘ兂烧_,因此會正常地輸出預(yù)設(shè)信息:

    [linuxprobe@linuxprobe ~]$ exit
    logout
    [root@linuxprobe root]# [ $USER != root ] || echo "administrator"
    administrator

就技術(shù)圖書的寫作來講,一般有兩種套路:讓讀者真正搞懂技術(shù)了;讓讀者覺得自己搞懂技術(shù)了。因此市面上很多淺顯的圖書會讓讀者在學(xué)完之后感覺進(jìn)步特別快,這基本上是作者有意為之,目的就是讓您覺得“圖書很有料,自己收獲很大”,但是在步入工作崗位后就露出短板吃大虧。所以劉遄老師決定繼續(xù)提高難度,為讀者增加一個綜合的示例,一方面作為前述知識的總結(jié),另一方面幫助讀者夯實(shí)基礎(chǔ),能夠在今后工作中更靈活地使用邏輯符號。

當(dāng)前我們正在登錄的即為管理員用戶—root。下面這個示例的執(zhí)行順序是,先判斷當(dāng)前登錄用戶的USER變量名稱是否等于root,然后用邏輯運(yùn)算符“非”進(jìn)行取反操作,效果就變成了判斷當(dāng)前登錄的用戶是否為非管理員用戶了。最后若條件成立則會根據(jù)邏輯“與”運(yùn)算符輸出user字樣;或條件不滿足則會通過邏輯“或”運(yùn)算符輸出root字樣,而如果前面的&&不成立才會執(zhí)行后面的||符號。

    [root@linuxprobe ~]# [ $USER != root ] && echo "user" || echo "root"
    root

整數(shù)比較運(yùn)算符僅是對數(shù)字的操作,不能將數(shù)字與字符串、文件等內(nèi)容一起操作,而且不能想當(dāng)然地使用日常生活中的等號、大于號、小于號等來判斷。因?yàn)榈忍柵c賦值命令符沖突,大于號和小于號分別與輸出重定向命令符和輸入重定向命令符沖突。因此一定要使用規(guī)范的整數(shù)比較運(yùn)算符來進(jìn)行操作??捎玫恼麛?shù)比較運(yùn)算符如表4-4所示。

表4-4 可用的整數(shù)比較運(yùn)算符

操作符 作用
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否等于或小于
-ge 是否大于或等于

接下來小試牛刀。我們先測試一下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=語句的方式把語句內(nèi)執(zhí)行的結(jié)果賦值給變量。

這個演示確實(shí)有些難度,但看懂后會覺得很有意思,沒準(zhǔn)在運(yùn)維工作中也會用得上。

    [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)會也不用擔(dān)心,接下來才是重點(diǎn)。我們使用整數(shù)運(yùn)算符來判斷內(nèi)存可用量的值是否小于1024,若小于則會提示“Insufficient Memory”(內(nèi)存不足)的字樣:

    [root@linuxprobe ~]# [ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
    Insufficient Memory

字符串比較語句用于判斷測試字符串是否為空值,或兩個字符串是否相同。它經(jīng)常用來判斷某個變量是否未被定義(即內(nèi)容為空值),理解起來也比較簡單。字符串比較中常見的運(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)前語系的環(huán)境變量值LANG不是英語(en.US)時,則會滿足邏輯測試條件并輸出“Not en.US”(非英語)的字樣:

    [root@linuxprobe ~]# echo $LANG
    en_US.UTF-8
    [root@linuxprobe ~]# [ $LANG != "en.US" ] && echo "Not en.US"
    Not en.US
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號