1. 程式人生 > >4.Shell 判斷用戶的參數

4.Shell 判斷用戶的參數

class 整數比較 劃分 memory clas ble 不同的 才會 系統環境

1.Shell 判斷用戶的參數

  系統在執行mkdir命令時會判斷用戶輸入的信息,即判斷用戶指定的文件夾名稱是否已經存在,如果存在則提示報錯;反之則自動創建。

  Shell腳本中的條件測試語法可以判斷表達式是否成立,若條件成立則返回數字0,否則便返回其他隨機數值。

條件測試語法:的執行格式如圖4-16所示。切記,條件表達式兩邊均應有一個空格

  技術分享圖片

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

文件測試語句;

邏輯測試語句;

整數值比較語句;

字符串比較語句。

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

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

2:實例

  下面使用文件測試語句來判斷/etc/fstab是否為一個目錄類型的文件,然後通過Shell解釋器的內設$?變量顯示上一條命令執行後的返回值。如果返回值為0,則目錄存在;

如果返回值為非零的值,則意味著目錄不存在:

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

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

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

  邏輯語句用於對測試結果進行邏輯分析,根據測試結果可實現不同的效果。例如在Shell終端中邏輯“與”的運算符號是&&,它表示當前面的命令執行成功後才會執行它後面的命令,

因此可以用來判斷/dev/cdrom文件是否存在,若存在則輸出Exist字樣。

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

  除了邏輯“與”外,還有邏輯“或”,它在Linux系統中的運算符號為||,表示當前面的命令執行失敗後才會執行它後面的命令,因此可以用來結合系統環境變量USER來判斷當前登錄

的用戶是否為非管理員身份:

[root@shizhan2 sh]# echo $USER
root
[root@shizhan2 sh]#  [ $USER = root ] || echo "user"
[root@shizhan2 sh]# su - hadoop
[hadoop@shizhan2 ~]$ [ $USER = root ] || echo "user"
user

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

原本測試錯誤的結果則將其變成正確的。

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

  先判斷當前登錄用戶的USER變量名稱是否等於root,然後用邏輯運算符“非”進行取反操作,效果就變成了判斷當前登錄的用戶是否為非管理員用戶了。最後若條件成立則會根據邏

輯“與”運算符輸出user字樣;或條件不滿足則會通過邏輯“或”運算符輸出root字樣,而如果前面的&&不成立才會執行後面的||符號。

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

  使用規範的整數比較運算符來進行操作數字,不能將數字與字符串、文件等內容一起操作

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

  我們先測試一下10是否大於10以及10是否等於10(通過輸出的返回值內容來判斷):

[root@linuxprobe ~]# [ 10 -gt 10 ]
[root@linuxprobe ~]# echo $?
1
[root@linuxprobe ~]# [ 10 -eq 10 ]
[root@linuxprobe ~]# echo $?
0

  free命令,它可以用來獲取當前系統正在使用及可用的內存量信息。接下來先使用free -m命令查看內存使用量情況(單位為MB),然後通過grep Mem:命令過濾出剩余內存量的行,

再用awk ‘{print $4}‘命令只保留第四列,最後用FreeMem=`語句`的方式把語句內執行的結果賦值給變量

[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

  我們使用整數運算符來判斷內存可用量的值是否小於1024,若小於則會提示“Insufficient Memory”(內存不足)的字樣:

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

  字符串比較語句用於判斷測試字符串是否為空值,或兩個字符串是否相同。它經常用來判斷某個變量是否未被定義(即內容為空值),理解起來也比較簡單。

字符串比較中常見的運算符如表4-5所示:

操作符 作用
= 比較字符串內容是否相同
!= 比較字符串內容是否不同
-z 判斷字符串內容是否為空

  接下來通過判斷String變量是否為空值,進而判斷是否定義了這個變量:

[root@linuxprobe ~]# [ -z $String ]
[root@linuxprobe ~]# echo $?
0

  再嘗試引入邏輯運算符來試一下。當用於保存當前語系的環境變量值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

  

4.Shell 判斷用戶的參數