當指令碼需要與執行指令碼的人員進行互動。
bash shell提供了命令列引數(新增在命令後面的資料值)、命令列選項(修改命令行為的單字元值)和直接讀取鍵盤輸入。
向shell指令碼傳遞資料的最基本方式是使用命令列引數。
讀取輸入的引數的變數為位置引數,位置引數通過標準數字表示,
其中$0為程式名稱,$1為第乙個引數,$2為第二個引數,依次類推,直到$9為第九個引數。
shell指令碼自動將命令列引數賦值給各個位置變數。
同時輸入多個引數(可以是數值也可以是字串)時,必須使用空格分隔(要想在引數值中包含空格,就必須使用單引號或雙引號)
當引數多於9個後,必須在shell指令碼內使用大括號將變數括起來,如$。從而可以使用任意個引數。
傳遞給變數$0的字串實際上是程式的路徑(根據呼叫方法決定是相對還是絕對路徑)。
使用basename命令可以去掉路徑字首,只獲得程式名稱(名字中不可以有空格)。
當指令碼認為應該包含引數,卻實際上沒有資料時,就會出錯。
好的方法是對引數進行檢查來保證使用引數前確實存在資料,可以使用-n引數來檢查。
ex: if [ –n 「$1」 ] then .. else .. fi
用於跟蹤命令列引數
使用特殊變數$#測試執行指令碼時包含的命令列引數個數。指令碼中任何位置都可以使用$#
ex: if [ $# –ne 2 ] 即可測試引數個數
可以使用$來返回最後乙個命令列引數(當無引數時,$#為0,而$為程式名)
變數$*將命令列中提供的所有引數作為乙個單詞處理,它將多個引數看成乙個引數。
變數$@將命令列中提供的所有引數作為同乙個字串中的多個單詞處理。允許對其中的值進行迭代(一般使用for),分隔開不同引數
shift命令能夠改變命令列引數的相對位置。預設將每個引數變數左移乙個位置(變數$0不變,把$1丟棄,注意不可以恢復了!)
在不清楚引數數目情況下,這是乙個迭代引數的好辦法。
可以為shift提供乙個引數,來實現多位移變化。
選項是由破折號引導的單個字母,用於更改命令的行為。
1)處理簡單選項
可以使用處理命令列引數相同的方法處理選項,抽取時使用case語句進行判斷是否符合選項格式。
2)從引數中分離選項
同時使用選項和引數時,可以使用--指示選項列表的結束。發現--後,shell就知道後面的是普通引數了,停止使用case處理選項。
3)處理帶值的選項
選項後緊跟引數值,一種方法是在case中對應選項後使用shift和讀後一位引數的方法處理。更好的方法如下:
getopt命令在處理選項和引數時非常方便。它對引數進行重新組織,以便於解析
1)命令格式
getopt可以接受任意形式的選項和引數列表,並自動將它們轉換為適當的格式。
命令格式為:getopt options optstring parameters
選項字串(opstring)用於定義命令列中的有效選項字母,以及哪些選項字母需要引數值。
2)指令碼中使用getopt
需要使用set命令將現有的命令列選項和引數替換為getopt命令生成的格式化形式。
需要將原始指令碼命令列引數送給getopt命令,然後將getopt命令輸出送給set命令,如下:set – `getopts –q ab:cd 「$@」`
但是getopt命令不能很好的處理帶有空格的引數值,它將空格解析為引數分隔符,而不是將雙引號引起來的兩個值合併成乙個引數。解決辦法如下:
getopts命令順序的對現有的shell引數變數進行處理,每呼叫一次,只處理命令中檢測到的引數中的乙個。處理完所有引數後,以大於0的退出狀態退出。
非常適宜於在迴圈中解析所有命令列引數
格式為: getopts optstring variable
$optarg包含需要引數值的選項要使用的值,$optind包含getopts停止處理時在引數列表中的位置。
注意:當getopts處理時,會將選項前的-去掉,所以對應的case中不需要破折號。
好的特性:
1)可以在引數值中包含空格
2)選項字母和引數值中間可以沒有空格
3)將在命令列中找到的未定義的選項都繫結為單一的輸出——問號
有一些字母選項具有標準含義。最好按照標準含義定義選項意義
-a –c –d –e –f –h –i –l –n –o –q –r –s –v- x –y
當需要在執行過程中獲得執行指令碼人員的輸入,使用read命令
read命令接受標準輸入或其他檔案描述符輸入。讀入後將資料放入乙個標準變數中。
-p允許在read命令列中直接指定乙個提示。
可以指定多個變數,也可以不指定(將放置在reply環境變數中)
使用-t指定乙個計時器,計時數滿還未輸入,read返回乙個非0的退出狀態。
使用-n指定輸入的字元個數,輸入達到預定數目時,就自動結束輸入
使用-s使輸入不顯示在終端(例如輸入密碼)
最常用的方法是使用cat命令,並通過管道傳給包含read的while語句。
ex: cat test | while read line
shell指令碼學習 處理使用者輸入
當指令碼需要與執行指令碼的人員進行互動。bash shell提供了命令列引數 新增在命令後面的資料值 命令列選項 修改命令行為的單字元值 和直接讀取鍵盤輸入。向shell指令碼傳遞資料的最基本方式是使用命令列引數。讀取輸入的引數的變數為位置引數,位置引數通過標準數字表示,其中 0為程式名稱,1為第乙...
Shell指令碼學習筆記 使用者輸入處理
1.命令列引數 1.1 引數之間空格分隔,格式 position,e.g.0,1,2,其中 0表示指令碼名字,超過10個引數時,e.g.第10個引數用 表示 1.2 簡單示例 1.3 通過建立軟連線的方式,同乙個指令碼,根據不同指令碼名字,執行不同指令碼內容,e.g.2.命令列引數變數的處理 2.1...
SHELL指令碼的基礎知識 處理使用者輸入
當指令碼需要與執行指令碼的人員進行互動。bash shell提供了命令列引數 新增在命令後面的資料值 命令列選項 修改命令行為的單字元值 和直接讀取鍵盤輸入。向shell指令碼傳遞資料的最基本方式是使用命令列引數。讀取輸入的引數的變數為位置引數,位置引數通過標準數字表示,其中 0為程式名稱,1為第乙...