中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Shell 編程從入門到精通 - 第 03 章

發布時間:2020-08-07 07:23:22 來源:ITPUB博客 閱讀:173 作者:Bao塔鎮河妖 欄目:建站服務器

Shell 編程的基本元素


    編程語言變量類型:變量對于編程語言來說很重要,編程語言使用變量來存儲數據,執行運輸。
     靜態類型語言:一種在編譯期間就確定數據類型的語言。大多數是通過在使用任一變量之前聲明其數據類型來保證這一點,例如 JAVA 和 C。
     動態類型語言:一種在運行期間才去確定數據類型的語言。它確定一個變量的類型是在第一次給變量賦值的時候,例如 VBScript 和 Pthyhon。
     強類型語言:一種總是強制類型定義的語言,當有一個整數時,不進行明確轉換,不能把它當做一個字符串,例如 JAVA 和 Python。
     弱類型語言:一種類型可以被忽略的語言,整數變量可以看做字符串,例如 VBScript 和 Shell。

Shell 編程從入門到精通 - 第 03 章

Shell 編程從入門到精通 - 第 03 章

Shell 編程從入門到精通 - 第 03 章

     從上圖的例子中可以看出,Bash Shell 中的變量是不區分類型的。
     shell 中的三種變量,用戶變量在編程過程中使用最多,位置變量在對參數判斷和命令返回值判斷時會使用,環境變量主要是在程序運行的時候需要設置。
     用戶變量:用戶在 shell 編程過程中定義的變量,分為局部變量和全局變量。默認情況下,用戶定義的變量都是全局變量,使用 local 限定詞定義的才是局部變量。變量定義的語法為 varname=value。等號兩邊不能有空格,而且變量值多余一個單詞的情況下,需要將值用引號括起來。在命令中引用變量值時,需要在變量名前加上 $。
     unset varname 可以刪除變量,但 shell 在遇到未定義變量時返回錯誤,因此在正常情況下并不這樣使用。
    
     大括號操作符可以使用 shell 字符串操作的更多高級功能,即字符串處理運算符。它可以完成:確保變量存在且有值;設置變量的默認值;捕獲未設置變量而導致的錯誤;刪除匹配模式的變量的值部分內容。

Shell 編程從入門到精通 - 第 03 章
    
     上表中每個冒號都是可選的,如果省略冒號,則將每個定義中的“存在且非 null”改為“存在”,即變量運算符只判定變量是否存在。

Shell 編程從入門到精通 - 第 03 章
Shell 編程從入門到精通 - 第 03 章

     模式匹配運算符可以對值進行操作,通常用于切割路徑名稱或文件名后綴

Shell 編程從入門到精通 - 第 03 章

     上圖中的變量替換,使用了兩種方法,將 PATH 變量中的冒號都替換成了換行符。

Shell 編程從入門到精通 - 第 03 章

     再舉一個例子,通過模式匹配刪除等號(包括等號)之后的所有字符,輸出部分就是變量名,刪除等號(包括等號)之前的所有字符,輸出部分就為變量值。

Shell 編程從入門到精通 - 第 03 章

     ${#varname}參數返回 varname 值字符串中的字符個數。
     除了通過賦值語句與通過用戶將變量作為命令行參數給出獲取變量值之外,另外一種方法為命令替換。它允許使用命令的標準輸出,就像一個變量值一樣,語法為 `command`,這里 ` 為反引號,它將命令的輸出作為表達式值。
    位置變量:也稱為系統變量、位置參數,是 shell 腳本運行時傳遞給腳本的參數,同時也表示在 shll 函數內部的函數參數。它們的名字是以數字命名 $0~$9,如果超過這個范圍需要用括號括起來,即 ${10}。
    
Shell 編程從入門到精通 - 第 03 章

Shell 編程從入門到精通 - 第 03 章

     上圖中是幾個常見的位置變量。其中 $# 輸出變量的個數;$? 輸出上條命令的返回值;$0 輸出命令的名字;$* 輸出所有參數,在雙引號中使用 \ 進行轉義。

Shell 編程從入門到精通 - 第 03 章

Shell 編程從入門到精通 - 第 03 章

     上圖程序運行過程解釋如下:判斷運行參數個數,如果不等于 2,顯示 Usage 內容,$0 代表的是腳本自身;用 grep 命令在 $2 文件中查找 $1 字符串;判斷前一條命令的返回值,成功顯示找到的相關信息,不成功則顯示 echo 內容;在雙引號中要顯示引號,需要加上 \ 轉義。
     shell 中內置了一個 shift 命令,它可以“截去”參數列表中最左端的一個,執行了 shift 后,$1 的值將會丟失,而 $2 的值將會賦給 $1,以此類推。$# 輸出結果也會減一。shift 命令默認為 shift 1,即截去一個參數。

Shell 編程從入門到精通 - 第 03 章

Shell 編程從入門到精通 - 第 03 章

     上例演示了 shift 的作用,將文件名作為參數傳入腳本中,每次讀取一個文件。另外也使用了循環的方式來實現此功能。
     環境變量:影響當前 shell 進程運行情況的變量。
     shell 執行命令的順序:交互 shell 在獲得用戶輸入時,并不是直接在 PATH 路徑中查找,而是按照固定順序依次查找命令位置。搜索順序為別名(alias)、關鍵字(if、for)、函數、內置命令(cd、pwd)、外部命令(腳本或可執行程序,到這里才在 PATH 路徑中查找)。
     使用函數需要遵循以下的規則:先定義,后使用;允許以給位置參數賦值的方式向函數傳遞參數,函數體內部可以使用 local 限定詞創建局部變量;在函數中使用 exit 命令將退出腳本,使用 return 命令退回到原本調用函數的地方,且 return 命令返回最后一條命令的退出狀態;內置命令 export -f 可以將函數導出到子 shell 中;可以使用 source 或 dot 命令將保存在其他文件中的函數裝入當前腳本;函數可以進行無限制的遞歸調用;可以使用 declare -f(-F) 找到登錄會話中定義的函數。

Shell 編程從入門到精通 - 第 03 章

     函數定義分為上圖中的兩種形式,二者沒有本質上的區別。unset -f funcname 可以刪除定義的函數,-f 提示 unset 命令刪除的是函數。

Shell 編程從入門到精通 - 第 03 章

Shell 編程從入門到精通 - 第 03 章

     首先,通過 source 命令將函數從文件中讀入,可以如使用命令一樣調用函數,然后將用戶名作為參數傳入函數中,判斷用戶是否在線。

Shell 編程從入門到精通 - 第 03 章

Shell 編程從入門到精通 - 第 03 章

     參數 $1 和 $2 分別對應于函數的兩個位置參數,在函數內部獲取位置參數才將它們相加;return 命令返回兩個位置參數的和;source 命令讀入函數;$? 返回上一條命令的返回結果。
     if/else 語句是 shell 內置的最簡單的流程控制語句,用于判斷當某條件成立時,則執行某些命令,常用于選項不多的情況。

Shell 編程從入門到精通 - 第 03 章

     在最簡形式(沒有 elif 和 else)中,只有當 condition 為真時,才執行 statements 語句;elif 可以有任意多個,它可以選擇更多的條件,提供更多的選擇,else 語句則當所有的 if 和 elif 的 condition 都為假時才執行。
     命令(函數)的退出狀態:每一條命令或函數,在退出時都會返回一個小的整數值給調用它的程序。

Shell 編程從入門到精通 - 第 03 章

     在 shell 的判斷語句中,條件(condition)實際上是語句列表而不是一般的布爾表達式。通常退出狀態 0 表示函數或命令執行成功,非 0 數表示失敗。
     shell 語法允許在邏輯上操作退出狀態,常見的有 NOT,AND 和 OR。

Shell 編程從入門到精通 - 第 03 章

     NOT 操作符是 !,在 condition 條件判斷后,用 ! 取反,再測試選擇執行語句。AND 操作符是 &&,先判斷 condition1,成功之后再判斷 condition2,如果兩個都判斷成功,則整個判斷語句成功。OR 操作符是 ||,只要兩個或多個條件中有一個成功,則整個判斷語句成功。AND 和 OR 都是短路運算符,即只要判斷出整個語句的真假,則直接返回,不向后繼續判斷,即使后面的語句根本無法執行。

Shell 編程從入門到精通 - 第 03 章

     if 語句唯一可以測試的內容是退出狀態,不能用于檢測表達式的值。但是通過 test 命令或 [...]的語法檢測,此時“[”后面和“]”前面必須有空格。
     
Shell 編程從入門到精通 - 第 03 章

     shell 支持字符串的比較,結合 test 或[ ... ]命令能判斷判斷比較結果,然后再進行相關操作。

Shell 編程從入門到精通 - 第 03 章

     將第一個位置參數傳遞給 test.sh,當 $1 不存在時,顯示一條出錯信息,如果 $1 存在且大于 0,則無顯示。-s 參數與文件名之間必須要有一個空格。$1 兩邊的引號確保即使它為一個空字符串,程序要能正常運行。

Shell 編程從入門到精通 - 第 03 章

     如果給出的位置參數小于 2 或 $1 指定的文件不存在,則退出。
    
Shell 編程從入門到精通 - 第 03 章
Shell 編程從入門到精通 - 第 03 章

     上表為常用的關于 test 的參數。

Shell 編程從入門到精通 - 第 03 章

     首先,判斷文件是否為目錄;如果不是目錄,則判斷文件是否存在;如果文件存在,則判斷文件是否具有讀寫執行的權限,通過則顯示 echo 語句;以上所有判定都不通過時,顯示 echo 語句。
     可以使用邏輯操作符連接帶參數的判斷語句,也可以使用邏輯操作符將表達式和 shell 命令組合在一起。
     case 也是一個流程控制結構,shell 中的 case 語句可以依據可包含通配符的模式測試字符串。通常可以使用 if-elif 語句配合 test 實現同樣的功能,但是當選擇數目過多時,就會體現出語句太長的局限性。
     
Shell 編程從入門到精通 - 第 03 章

     從語法中可以看出,任何 pattern 之間都可以由 | 分割的幾個模式組成,這種情況下 expression 匹配其中任意一個模式則執行相應語句。模式匹配按順序依次執行,知道匹配上為止,如果無法匹配,則不執行任何操作。
     case 語句與 fi 語句一樣,結束時是通過字符串顛倒(reverse)。

Shell 編程從入門到精通 - 第 03 章

     判斷文件后綴,根據不同后綴選擇不同的讀取方式,最后一個 * 匹配所有其他匹配不上的形式,相當于 C 語言中的 default。
     循環可以控制某些代碼的重復行為或允許對多個對象操作。
     for 循環用于遍歷整個對象/數字列表,依次執行每個獨立對象/數字的循環內容,在 shell 腳本里,對象可以是命令行參數、文件名或者任何可以以列表格式建立的東西。

Shell 編程從入門到精通 - 第 03 章

     list 為名稱列表,在 for 循環中對名稱列表中的每個對象進行相應操作,可以通過命令/模式匹配等操作來獲取名稱列表。
    
Shell 編程從入門到精通 - 第 03 章

     兩個例子都可以遍歷 mp3 文件并且依次播放。但是使用 find 命令會層層深入文件夾依次查找,而直接列出只會包含當前目錄的文件夾。執行反單引號(``)之前的命令,引用結果作為字符串。for 循環中如果 in list 參數被省略,則默認為 in "$@",即命令行參數的引用列表。
     
Shell 編程從入門到精通 - 第 03 章

     shell 中的 while 和 until 循環與傳統語言中的 while 和 do/until 相似,它們允許代碼在某些條件為真(或直到為真)時重復運行。while 與 until 唯一的區別在于如何判斷 condition 的退出狀態。在 while 語句中當 condition 的退出狀態為真時循環繼續運行,否則退出循環;而 until 語句中當 condition 的退出狀態為真時循環退出,否則繼續運行。它們中的 condition,可以是簡單的命令/列表,或者是包含 && 或 || 連接的命令,與 if 語句中的 test 一樣。

Shell 編程從入門到精通 - 第 03 章

     遍歷 PATH 路徑:先賦值 path;判斷當 path 不為空,則使用 ls -ld 列出 path 中的第一個目錄;然后截去 path 中的第一個目錄和冒號;當 path 被截成空字符串("")時,退出循環。

Shell 編程從入門到精通 - 第 03 章

Shell 編程從入門到精通 - 第 03 章

     在 shell 中經常使用 while true 或者 until false 來構建無限循環。continue 語句用于在循環體中提早開始下一輪循環,break 語句用于跳出整個循環,而 continue 與break 語句也彌補了 shell 中沒有 goto 的不足。在多層循環中,continue n 表示會把 n 層的剩余代碼都去掉,break n 表示退出 n 層循環。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

营口市| 山东省| 巩义市| 安顺市| 稷山县| 依兰县| 且末县| 三原县| 长沙县| 盘锦市| 姚安县| 营口市| 宜春市| 台前县| 民乐县| 怀来县| 定远县| 衡阳县| 贡觉县| 西盟| 巴林右旗| 三亚市| 嘉荫县| 浦城县| 团风县| 蕲春县| 乌兰察布市| 江源县| 海安县| 视频| 甘谷县| 潮州市| 定南县| 方山县| 台北市| 隆昌县| 利辛县| 小金县| 顺平县| 无棣县| 扶绥县|