向shell腳本傳遞數據的最基本方法是使用命令行參數。命令行參數允許在運行腳本時向命令行添加數據。
向腳本addem傳遞了兩個命令行參數(10和30)
./addem 10 30
bash shell會将一些稱為位置參數(positional parameter)的特殊變量分配給輸入到命令行中的所有參數。這也包括shell所執行的腳本名稱。位置參數變量是标準的數字:$0是程序名,$1是第一個參數,$2是第二個參數,依次類推,直到第九個參數$9。
參數也可以是文本字符串,要在參數值中包含空格,必須要用引号(單引号或雙引号均可)。
如果腳本需要的命令行參數不止9個,你仍然可以處理,但是需要稍微修改一下變量名。在第9個變量之後,你必須在變量數字周圍加上花括号,比如${10}。
14.1.2 讀取腳本名
可以用$0參數獲取shell在命令行啟動的腳本名
當傳給$0變量的實際字符串不僅僅是腳本名,而是完整的腳本路徑時,變量$0就會使用整個路徑。
basename命令會返回不包含路徑的腳本名。
在使用參數前一定要檢查其中是否存在數據。
14.2 特殊參數變量14.2.1 參數統計
特殊變量$#含有腳本運行時攜帶的命令行參數的個數。
14.2.2 抓取所有的數據
$* 和 $@ 變量可以用來輕松訪問所有的參數。這兩個變量都能夠在單個變量中存儲所有的命令行參數。
$* 變量會将命令行上提供的所有參數當作一個單詞保存。這個單詞包含了命令行中出現的每一個參數值。基本上$*變量會将這些參數視為一個整體,而不是多個個體。
$@變量會将命令行上提供的所有參數當作同一字符串中的多個獨立的單詞。這樣就能夠遍曆所有的參數值,得到每個參數。
從表面上看,兩個變量産生的是同樣的輸出,都顯示出了所有命令行參數。
$*變量會将所有參數當成單個參數,而$@變量會單獨處理每個參數。
14.3 移動變量
在使用shift命令時,默認情況下它會将每個參數變量向左移動一個位置。所以,變量$3的值會移到$2中,變量$2的值會移到$1中,而變量$1的值則會被删除(注意,變量$0的值,也就是程序名,不會改變)。
這個腳本通過測試第一個參數值的長度執行了一個while循環。當第一個參數的長度為零時,循環結束。測試完第一個參數後,shift命令會将所有參數的位置移動一個位置。
也可以一次性移動多個位置,隻需要給shift命令提供一個參數,指明要移動的位置數就行了。
14.4 處理選項
選項是跟在單破折線後面的單個字母,它能改變命令的行為。
14.4.1 查找選項1. 處理簡單選項在提取每個單獨參數時,用case語句(參見第12章)來判斷某個參數是否為選項。
2. 分離參數和選項
shell腳本中有同時使用選項和參數的情況,特殊字符雙破折線(--)來表明選項列表結束。在雙破折線之後,腳本就可以放心地将剩下的命令行參數當作參數,而不是選項來處理了。
3. 處理帶值的選項
有些選項會帶上一個額外的參數值
在這個例子中,case語句定義了三個它要處理的選項。-b選項還需要一個額外的參數值。由于要處理的參數是$1,額外的參數值就應該位于$2(因為所有的參數在處理完之後都會被移出)。隻要将參數值從$2變量中提取出來就可以了。當然,因為這個選項占用了兩個參數位,所以你還需要使用shift命令多移動一個位置。
14.4.2 使用getopt命令1. 命令的格式getopt命令可以接受一系列任意形式的命令行選項和參數,并自動将它們轉換成适當的格式。它的命令格式如下:
getopt optstring parameters
optstring是這個過程的關鍵所在。它定義了命令行有效的選項字母,還定義了哪些選項字母需要參數值。
首先,在optstring中列出你要在腳本中用到的每個命令行選項字母。然後,在每個需要參數值的選項字母後加一個冒号。getopt命令會基于你定義的optstring解析提供的參數。
optstring定義了四個有效選項字母:a、b、c和d。冒号(:)被放在了字母b後面,因為b選項需要一個參數值。當getopt命令運行時,它會檢查提供的參數列表(-a -b test1 -cd test2 test3),并基于提供的optstring進行解析。注意,它會自動将-cd選項分成兩個單獨的選項,并插入雙破折線來分隔行中的額外參數。
如果指定了一個不在optstring中的選項,默認情況下,getopt命令會産生一條錯誤消息。
如果想忽略這條錯誤消息,可以在命令後加-q選項。
2. 在腳本中使用getopt
14.4.3 使用更高級的getopts
與getopt不同,前者将命令行上選項和參數處理後隻生成一個輸出,而getopts命令能夠和已有的shell參數變量配合默契。
每次調用它時,它一次隻處理命令行上檢測到的一個參數。處理完所有的參數後,它會退出并返回一個大于0的退出狀态碼。這讓它非常适合用解析命令行所有參數的循環中。
getopts命令的格式如下:
getopts optstring variable
optstring值類似于getopt命令中的那個。有效的選項字母都會列在optstring中,如果選項字母要求有個參數值,就加一個冒号。要去掉錯誤消息的話,可以在optstring之前加一個冒号。getopts命令将當前參數保存在命令行中定義的variable中。
getopts命令會用到兩個環境變量。如果選項需要跟一個參數值,OPTARG環境變量就會保存這個值。OPTIND環境變量保存了參數列表中getopts正在處理的參數位置。這樣你就能在處理完選項之後繼續處理其他命令行參數了。
可以在參數值中包含空格。
将選項字母和參數值放在一起使用,而不用加空格。
getopts還能夠将命令行上找到的所有未定義的選項統一輸出成問号。
14.5 将選項标準化
自己的選項采用同樣的含義。
14.6 獲得用戶輸入14.6.1 基本的讀取
read命令從标準輸入(鍵盤)或另一個文件描述符中接受輸入。在收到輸入後,read命令會将數據放進一個變量
生成提示的echo命令使用了-n選項。該選項不會在字符串末尾輸出換行符,允許腳本用戶緊跟其後輸入數據,而不是下一行。
read命令包含了-p選項,允許你直接在read命令行指定提示符。隻有一個變量的話,read命令會将提示符後輸入的所有數據分配給單個變量。若指定多個變量,輸入的每個數據值都會分配給變量列表中的下一個變量。如果變量數量不夠,剩下的數據就全部分配給最後一個變量。
也可以在read命令行中不指定變量。如果是這樣,read命令會将它收到的任何數據都放進特殊環境變量REPLY中。
14.6.2 超時
使用read命令時要當心。腳本很可能會一直苦等着腳本用戶的輸入。如果不管是否有數據輸入,腳本都必須繼續執行,你可以用-t選項來指定一個計時器。-t選項指定了read命令等待輸入的秒數。當計時器過期後,read命令會返回一個非零退出狀态碼。
如果計時器過期,read命令會以非零退出狀态碼退出,可以使用如if-then語句或while循環這種标準的結構化語句來理清所發生的具體情況。在本例中,計時器過期時,if語句不成立,shell會執行else部分的命令。
也可以不對輸入過程計時,而是讓read命令來統計輸入的字符數。當輸入的字符達到預設的字符數時,就自動退出,将輸入的數據賦給變量。
14.6.3 隐藏方式讀取
-s選項可以避免在read命令中輸入的數據出現在顯示器上(實際上,數據會被顯示,隻是read命令會将文本顔色設成跟背景色一樣)
14.6.4 從文件中讀取
可以用read命令來讀取Linux系統上文件裡保存的數據。每次調用read命令,它都會從文件中讀取一行文本。當文件中再沒有内容時,read命令會退出并返回非零退出狀态碼。
其中最難的部分是将文件中的數據傳給read命令。最常見的方法是對文件使用cat命令,将結果通過管道直接傳給含有read命令的while命令。
while循環會持續通過read命令處理文件中的行,直到read命令以非零退出狀态碼退出。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!