shell 腳本中關於用戶輸入參數的處理

shell 腳本中關於用戶輸入參數的處理

1、命令行參數

向shell腳本傳遞數據的最基本方式是使用命令行參數。

(1) 讀取參數

   讀取輸入的參數的變量爲位置參數,位置參數通過標準數字表示,

   其中$0爲程序名稱,$1爲第一個參數,$2爲第二個參數,依次類推,直到$9爲第九個參數。

   shell腳本自動將命令行參數賦值給各個位置變量。

   同時輸入多個參數(可以是數值也可以是字符串)時,必須使用空 格分隔(要想在參數值中包含空格,就必須使用單引號或雙引號)

   當參數多於9個後,必須在shell腳本內使用大括號將變量括起來,如${10}。從而可以使用任意個參數。

(2)讀取程序名稱

傳遞給變量$0的字符串實際上是程序的路徑(根據調用方法決定是相對還是絕對路徑)。

使用basename命令可以去掉路徑前綴,只獲得程序名稱(名字中不 可以有空格)。

(3)測試腳本

當腳本認爲應該包含參數,卻實際上沒有數據時,就會出錯。

好的方法是 對參數進行檢查來保證使用參數前確實存在數據,可以使用-n參數來檢查。

ex: if [ –n “$1” ] then .. else .. fi

2、特殊的參數變量

用於跟蹤命令行參數

(1)參數計數

使用特殊變量$#測試執行腳本時包含的命令行參 數個數。腳本中任何位置都可以使用$#

ex: if [ $# –ne 2 ] 即可測試參數個數

可 以使用${!#}來返回最後一個命令行參數(當無參數時,$#爲0, 而${!#}爲程序名)

(2)獲取所有數據

變量$*將命令行中提供的所有參數作爲一個單詞處理,它將多個參數看成 一個參數。

變量$@將命令行中提供的所 有參數作爲同一個字符串中的多個單詞處理。允許對其中的值進行迭代(一般使用for),分隔開不同參數

3、 移位

shift命 令能夠改變命令行參數的相對位置。默認將每個參數變量左移一個位置(變量$0不變,把$1丟棄,注意 不可以恢復了!)

在不清楚參數數目情況下,這是一個迭代參數的好辦法。

可 以爲shift提供一個參數,來實現多位移變化。

4、處理選項

選項是由破折號 引導的單個字母,用於更改命令的行爲。

(1)找出選項

1)處理簡單選項

可以使用處理命令行參數相同的方法處理選項,抽取時使用case 語句進行判斷是否符合選項格式。

2)從參數中分離選項

同 時使用選項和參數時,可以使用--指示選項列表的結束。發現--後,shell就知道後面的是普通參數了,停止使用case處理選項。

3) 處理帶值的選項

選項後緊跟參數值,一種方法是在case中對應選項後使用shift和讀後一位參數的 方法處理。更好的方法如下:

(2)使用getopt命 令

getopt命令在處理選項和參數時 非常方便。它對參數進行重新組織,以便於解析

1)命令格式

getopt可以接受任意 形式的選項和參數列表,並自動將它們轉換爲適當的格式。

命令格式爲: getopt options optstring parameters

選項字符串(opstring)用於定義命令行 中的有效選項字母,以及哪些選項字母需要參數值。

2)腳本中使用getopt

需要使用set命令將現有的 命令行選項和參數替換爲getopt命令生成的格式化形式。

需要將原始腳本命令行參數送給getopt命令,然後將 getopt命令輸出送給set命令,如下:set – `getopts –q ab:cd “$@”`

但 是getopt命令不能很好的處理帶有空格的參數值,它將空格解析爲參數分隔符,而不是將雙引號引起來的兩個值合併成一個參數。解決辦 法如下:

(3)更高級的getopts命令

getopts命令順序的對現有的shell參數變量進行處理, 每調用一次,只處理命令中檢測到的參數中的一個。處理完所有參數後,以大於0的退出狀態退出。

非常適宜於在循環中解析所 有命令行參數

格式爲: getopts optstring variable

$OPTARG包含需 要參數值的選項要使用的值,$OPTIND包含getopts停止處理時在參數列表中的位置。

注意:當getopts處 理時,會將選項前的-去掉,所以對應的case中不需要破折號。

好的特性:

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命令行中直接指定一個提示。

可以指定多個變量,也可以不指定(將放置在REPLY環境變量中)

(2)計 時

使用-t指定一個計時器,計時數滿還未輸入,read返回一個非0的退出狀態。

使 用-n指定輸入的字符個數,輸入達到預定數目時,就自動結束輸入

(3)默讀

使用 -s使輸入不顯示在終端(例如輸入密碼)

(4)讀取文件

最常用的方法是使用cat命令,並通過管 道傳給包含read的while語句。

ex: cat test | while read line

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章