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

2023-05-11 14:47 更新

學(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
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)