iT邦幫忙

DAY 26
4

我與BASH shell scripting的每一天系列 第 26

我與BASH的每一天 - [26] 使用者參數選項 - getopts

要設計具備使用者參數選項功能的程式,除了利用參數變數之外,例如**$1**, $1到**$9**,不夠用在借助shift與**$@, $*符號來幫忙,還可以使用getopts**來達成。

第一種作法比較沒有彈性,因為你設計好的參數數量是固定的,就算是空值也要輸入才行,要不然參數依照位置排列來定義$1, $2,... 漏掉一個可是會讓後面的輸入全盤皆錯。而且如果要使用的參數很長,在沒有任何標示下要連續輸入很多參數的話,也很容易發生遺漏或是寫錯的情形。

使用getopts是比較好的做法,getopts可以提供參數旗標,讓使用者根據旗標來設定參數的值。這樣不僅簡潔,也更有意義而不易犯錯。

getopts必須要搭配whilecase來達成,直接看例子:

while getopts “a:b:c:?” argv
do
     case $argv in
         a)
             VAR1=$OPTARG
             ;;
         b)
             VAR2=$OPTARG
             ;;
         c)
             VAR3=$OPTARG
             ;;
         ?)
             usage
             exit
             ;;
     esac
done

作法就是令while等待使用者輸入getopts所設定的參數,再經由case來依據使用者所輸入的值來決定下一步的動作。

getopts的用法是使用一個字串(由引號"..."刮起來)來代表會用到的參數旗標,而冒號**:代表的是該旗標是帶有參數值的。像這個例子中”a:b:c:?”這個字串,代表有a, b, c這三個參數都需要帶有輸入的值,?則不需要帶值。所以接下來的case命令就可以用來處理使用者的輸入,當旗標a, b, c被引用時,他後面所接的參數值就會在case命令中透過變數$OPTARG指定給相對應的變數VAR1, VAR2, VAR3**,以進行後續動作。而如果引用**?,則直接執行usage函數後即離開exit**。

執行程式是要引用參數旗標的方式是減號加上旗標,後面再跟著參數值,也就是Linux慣用的命令輸入方式: script -option value

[系列文章]

我與BASH的每一天 - [1]利用bc命令來取得數字字串中的特定欄位值
我與BASH的每一天 - [2]直取字串變數中的特定欄位值
我與BASH的每一天 - [3] 利用awk來擷取特定欄位
我與BASH的每一天 - [4] 利用awk來擷取特定欄位-2
我與BASH的每一天 - [5] 利用awk來擷取特定欄位-3
我與BASH的每一天 - [6] 利用cut來擷取特定欄位
我與BASH的每一天 - [7] grep指令的妙用 - 1
我與BASH的每一天 - [8] grep指令的妙用 - 2
我與BASH的每一天 - [9] 正規化表示法 - 1
我與BASH的每一天 - [10] 正規化表示法 - 2
我與BASH的每一天 - [11] 正規化表示法 - 3
我與BASH的每一天 - [12] 正規化表示法 - 4
我與BASH的每一天 - [13] sed - 1
我與BASH的每一天 - [14] sed - 2
我與BASH的每一天 - [15] sed - 3
我與BASH的每一天 - [16] 多條件選擇 - case
我與BASH的每一天 - [17] 建立自動化的暫存檔 - mktemp
我與BASH的每一天 - [18] if 條件判斷的正規化用法
我與BASH的每一天 - [19] 複合式的條件判斷
我與BASH的每一天 - [20] 代表參數位置的特殊變數符號與shift
我與BASH的每一天 - [21] 特殊的參數變數符號: $@ 與 $*
我與BASH的每一天 - [22] while-loop與array的結合
我與BASH的每一天 - [23] 顯示程式執行的進度
我與BASH的每一天 - [24] 打包initrd image
我與BASH的每一天 - [25] 紀錄鍵盤動作的命令 - script


上一篇
我與BASH的每一天 - [25] 紀錄鍵盤動作的命令 - script
下一篇
我與BASH的每一天 - [27] getopts 的錯誤控制設計
系列文
我與BASH shell scripting的每一天31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
aron1227
iT邦新手 5 級 ‧ 2020-10-12 16:23:18

謝謝大大分享

我要留言

立即登入留言