
寫在前面,本篇適用于有一定shell基礎的同學,主要對shell處理用戶輸入相關的常用小知識點的歸總,主要涵蓋以下幾個知識點:
- 腳本外部引數
- 腳本引數跟蹤
- 移動變數
- 處理選項
- 將選項標準化
- 獲得用戶輸入
一、shell命令列傳入引數
1.1 數值引數傳入
shell 腳本語言的傳入引數,相較于其他語言會更直接易懂,bash shell會將一些稱為位置引數(positional parameter)的特殊變數分配給輸入到命令列中的 所有引數,這也包括shell所執行的腳本名稱,位置引數變數是標準的數字:$0是程式名,$1是第 一個引數,$2是第二個引數,依次類推,直到第九個引數$9,
實體演示:

說明:
命令列引數可以同時輸入多個,每個引數都必須用空格分開,
1.2 文本字串引數傳入
1.3 空格文本字串傳入
實體演示:

1.4 任意引數傳入
上面我們提到變數可以一致到$9,如果超過9個,變數 10以上也是可以使用的,此時需要用{} 包含,比如 ${10} ,這樣就滿足了從命令列向腳本傳入任意多的引數.
實體演示:

二、shell腳本名稱的獲取
$0 引數獲取 shell 在命令列啟動的腳本名,
示例演示:

這樣會有一個問題,當我們使用絕對路徑來指定腳本的時候,獲取的檔案名就對帶有絕對路徑,此時就需要借助另一個命令 basename,它會剝離腳本的絕對路徑和腳本名稱,
示例演示:

三、shell判斷引數是否存在
當腳本認為引數變數中會有資料而實際上并沒有時,腳本很有可能會產生錯誤訊息,這種寫腳本的方法很容報錯,在使用引數前一定要檢查其中是否存在資料,
四、shell統計引數個數
五、shell獲取命令列最后一個引數

六、shell獲取所有引數
$*和 $@變數可以用來輕松訪問所有的引數,這兩個變數都能夠在單個變數中存盤所有的命令行引數,$*變數會將命令列上提供的所有引數當作一個單詞保存,這個單詞包含了命令列中出現的每一個引數值,基本上$*變數會將這些引數視為一個整體,而不是多個個體,另一方面,$@變數會將命令列上提供的所有引數當作同一字串中的多個獨立的單詞,這樣 你就能夠遍歷所有的引數值,得到每個引數,這通常通過for命令完成,
示例演示:
相同效果:

不用效果:

七、shell移動變數
bash shell工具箱中另一件工具是 shift 命令, bash shell 的 shift 命令能夠用來操作命令列參 數,跟字面上的意思一樣,shift 命令會根據它們的相對位置來移動命令列引數,在使用shift 命令時,默認情況下它會將每個引數變數向左移動一個位置,所以,變數 $3的值會移到 $2 中,變數 $2 的值會移到 $1 中,而變數 $1 的值則會被洗掉(注意,變數 $0 的值,也就是程式名,不會改變),這是遍歷命令列引數的另一個好方法,尤其是在不知道到底有多少引數時,可以只操作 第一個引數,移動引數,然后繼續操作第一個引數,
演示示例:

八、shell選項引數的處理
示例演示:

8.2 分離引數和選項


腳本說明:
8.3 處理帶值的選項
腳本代碼:
#!/bin/bash
# extracting command line options and values
echo
while [ -n "$1" ]
do
case "$1" in
-a) echo "Found the -a option";;
-b) param="$2"
echo "Found the -b option, with parameter value $param"
shift ;;
-c) echo "Found the -c option";;
--) shift
break ;;
*) echo "$1 is not an option";;
esac
shift
done
#
count=1
for param in "$@"
do
echo "Parameter #$count: $param"
count=$[ $count + 1 ]
done
演示示例 :

代碼說明:
在這個例子中, case 陳述句定義了三個它要處理的選項, -b 選項還需要一個額外的引數值,由于要處理的引數是 $1 ,額外的引數值就應該位于 $2 (因為所有的引數在處理完之后都會被移 出),只要將引數值從$2 變數中提取出來就可以了,當然,因為這個選項占用了兩個引數位,所以你還需要使用shift 命令多移動一個位置
尖叫提示:
畢業作業幾年,月入還不到2萬的建議速看_滌生手記大資料-CSDN博客
滌生手記的由來|聯系方式|留言板_滌生手記大資料-CSDN博客
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/344298.html
標籤:其他
