Bash shell提供命令行參數以在命令後添加數據值)、命令行選項以修改命令行為的單字符值)並直接讀取鍵盤輸入。
1,命令行參數
向shell腳本傳遞數據的最基本方法是使用命令行參數。
1)讀取參數
輸入參數的變量是位置參數,用標準數字表示。
其中$0是程序名,$1是第壹個參數,$2是第二個參數,依此類推,直到$9是第九個參數。
Shell腳本自動將命令行參數分配給各種位置變量。
當您同時輸入多個參數時,必須使用空格來分隔它們。若要在參數值中包含空格,必須使用單引號或雙引號。)
當參數超過9個時,您必須在shell腳本中將變量括在大括號中,例如${10}。因此可以使用任意數量的參數。
2)讀取程序名稱
傳遞給變量$0的字符串實際上是程序的路徑。
使用basename命令刪除路徑前綴,只獲取程序名。
3)測試腳本
當腳本認為它應該包含參數,但實際上沒有數據時,將會出現錯誤。
壹個好方法是在使用參數之前檢查參數以確保有數據。您可以使用-n參數進行檢查。
示例:如果【–n“$ 1“】,則...其他...船方不負擔裝貨費用
2.特殊參數變量
用於跟蹤命令行參數。
1)參數計數
使用特殊變量$ #測試執行腳本時包含的命令行參數的數量。您可以在腳本的任何地方使用$ #。
示例:if【$ #-ne 2】可以測試參數的數量。
您可以使用$ {!#}返回最後壹個命令行參數。當沒有參數時,$ #為0,而$ {!#}是程序名稱)
獲取所有數據
變量$ *將命令行中提供的所有參數視為壹個單詞,並將多個參數視為壹個參數。
變量$ @將命令行中提供的所有參數視為同壹字符串中的多個單詞。允許叠代其中的值,通常使用for)來分隔不同的參數。
3.變化
shift命令可以更改命令行參數的相對位置。默默地將每個參數變量向左移動壹個位置變量$0,並丟棄$1。小心它無法恢復!)
當參數數量未知時,這是叠代參數的好方法。
您可以為shift提供壹個參數,以實現多種位移變化。
4.處理選項
選項是由破折號引導的單個字母,用於更改命令的行為。
1,找到選項。
1)處理簡單選項
選項可以像命令行參數壹樣處理,可以使用case語句來判斷選項是否符合格式。
2)將選項與參數分開
當同時使用選項和參數時,可以使用-來指示選項列表的結尾。當找到-時,shell將知道後面是壹個正常參數,並停止使用案例處理選項。
3)處理帶有值的選項
選項後跟參數值。壹種方法是使用shift並讀取案例中相應選項後的最後壹個參數。更好的方法如下:
2、使用getopt命令
getopt命令在處理選項和參數時非常方便。它重新組織了參數以便於分析。
1)命令格式
Getopt可以接受任何形式的選項和參數列表,並自動將其轉換為適當的格式。
命令格式為:getopt選項optstring參數。
Opstring用於定義命令行中的有效選項字母以及哪些選項字母需要參數值。
2)在腳本中使用getopt
您需要使用set命令將現有的命令行選項和參數替換為getopt命令生成的格式化形式。
您需要將原始腳本命令行參數發送給getopt命令,然後將getopt命令輸出發送給set命令,如下所示:set–` getopts–q ab:CD“$ @“`。
但是,getopt命令不能很好地處理帶有空格的參數值。它將空格解析為參數分隔符,而不是將雙引號引起的兩個值合並為壹個參數。解決方案如下:
3)更高級的getopts命令
getopts命令按順序處理現有的shell參數變量,並且每次調用時只處理命令中檢測到的參數之壹。處理完所有參數後,以大於0的退出狀態退出。
非常適合解析循環中的所有命令行參數。
格式:getopts optstring變量
$optarg包含用於需要參數值的選項的值,$optind包含getopts停止處理時在參數列表中的位置。
註意:當處理getopts時,選項前的-將被刪除,因此在相應的情況下不需要破折號。
良好的特性:
1)可以在參數值中包含空格。
2)選項字母和參數值之間不能有空格。
3)將命令行中所有未定義的選項綁定到壹個輸出問號中。
5.標準化選項
壹些字母選項具有標準含義。最好根據標準含義來定義選項的含義。
-a–c–d–e–f–h–I–l–n–o–q–r–s–v-x–y
6.獲取用戶輸入
當您需要在執行過程中獲取腳本執行器的輸入時,請使用read命令。
1)
read命令接受標準輸入或其他文件描述符輸入。讀取後將數據放入標準變量中。
-p允許您直接在read命令行上指定提示符。
您可以指定多個變量,也可以不指定將其放在回復環境變量中)
2 .時間安排
使用-t指定計時器,read在計時器到期前返回非零退出狀態。
使用-n指定要輸入的字符數。當輸入達到預定數量時,它將自動結束輸入。
3)默讀
使用-s使輸入不顯示在終端上,如輸入密碼)
4)讀取文件
最常用的方法是使用cat命令,並通過管道將其傳遞給包含read的while語句。