1. 程式人生 > >Linux進階第七天

Linux進階第七天

登錄用戶 變量名 image 定向 ges ado 發現 shell shell變量

47.編寫Shell腳本

shell腳本的模式:
交互式(Interactive):用戶每輸入一條命令就立即執行。
批處理(Batch):由用戶事先編寫好一個完整的Shell腳本,Shell會一次性執行腳本中諸多的命令。
查看SHELL變量可以發現當前系統已經默認使用Bash作為命令行終端解釋器了:
技術分享圖片
查看系統默認使用Bash作為命令行終端解釋器


簡單寫一個腳本:
技術分享圖片
第一行的腳本聲明(#!)用來告訴系統使用哪種Shell解釋器來執行該腳本;第二行的註釋信息(#)是對腳本功能和某些命令的介紹信息,使得自己或他人在日後看到這個腳本內容時,可以快速知道該腳本的作用或一些警告信息;第三、四行的可執行語句也就是我們平時執行的Linux命令了。

運行看看:
技術分享圖片
除了上面用bash解釋器命令直接運行Shell腳本文件外,第二種運行腳本程序的方法是通過輸入完整路徑的方式來執行。但默認會因為權限不足而提示報錯信息,此時只需要為腳本文件增加執行權限即可
技術分享圖片
賦值:
技術分享圖片
48.接受用戶的參數:

變量之間可以使用空格間隔。例如$0對應的是當前Shell腳本程序的名稱,$#對應的是總共有幾個參數,$*對應的是所有位置的參數值,$?對應的是顯示上一次命令的執行返回值,而$1、$2、$3……則分別對應著第N個位置的參數值

再寫一個腳本:
技術分享圖片
運行:
技術分享圖片

49.判斷用戶的參數
測試語句格式【 條件表達式 】括號兩邊有空格
按照測試對象來劃分,條件測試語句可以分為4種:
? 文件測試語句;

? 邏輯測試語句;
? 整數值比較語句;
? 字符串比較語句。
文件測試即使用指定條件來判斷文件是否存在或權限是否滿足等情況的運算符,具體的參數如下:

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


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

技術分享圖片
判斷/etc/fstab是否為一般文件:

技術分享圖片

返回值為0,則為一般文件

邏輯語句用於對測試結果進行邏輯分析,根據測試結果可實現不同的效果。例如在Shell終端中邏輯“與”的運算符號是&&,它表示當前面的命令執行成功後才會執行它後面的命令,因此可以用來判斷/dev/cdrom文件是否存在,若存在則輸出my name is lgm字樣。

技術分享圖片
無輸出,
可以用來判斷/etc/fstab文件是否存在,若存在則輸出my name is lgm字樣。
技術分享圖片
存在即輸出


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

技術分享圖片

技術分享圖片


第三種邏輯語句是“非”,在Linux系統中的運算符號是一個嘆號(!),它表示把條件測試中的判斷結果取相反值。也就是說,如果原本測試的結果是正確的,則將其變成錯誤的;原本測試錯誤的結果則將其變成正確的。
我們現在切換到一個普通用戶的身份,再判斷當前用戶是否為一個非管理員的用戶。由於判斷結果因為兩次否定而變成正確,因此會正常地輸出預設信息:
技術分享圖片


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

技術分享圖片
有一行報錯?
為什麽?
切換下用戶:
技術分享圖片
還是有報錯?
問題出在哪?
註意了!
問題出在了!
技術分享圖片
!與$兩符號間一定要有空格!
我們再執行看:
技術分享圖片
切換root用戶:
技術分享圖片
所以說,這種小錯誤一定要牢記!


整數比較運算符僅是對數字的操作,不能將數字與字符串、文件等內容一起操作,而且不能想當然地使用日常生活中的等號、大於號、小於號等來判斷。因為等號與賦值命令符沖突,大於號和小於號分別與輸出重定向命令符和輸入重定向命令符沖突。因此一定要使用規範的整數比較運算符來進行操作。

-eq 是否等於
-ne 是否不等於
-gt 是否大於
-lt 是否小於
-le 是否等於或小於
-ge 是否大於或等於

有些不好記


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


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

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


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


再嘗試引入邏輯運算符來試一下。當用於保存當前語系的環境變量值LANG不是英語(en.US)時,則會滿足邏輯測試條件並輸出“Not en.US”(非英語)的字樣:
技術分享圖片


今日初步玩SHELL編程,還需深入提升!

Linux進階第七天