getopts的用法解讀

getopts 命令

用途

處理命令行參數,並校驗有效選項。

語法

getopts 選項字符串 名稱 [ 參數 ...]

 

getopts 命令是 Korn/POSIX shell 的內置命令,用來從參數列表檢索選項以及選項參數。選項由一個+(加號)或者是由一個-(減號)後跟一個字符開始。一個既不是以+,也不是以-開始的選項結束選項字符串。每次調用 getopts 命令時,它將下一個選項的值放置在名稱內,並將下一個要處理的參數的索引置於 shell 變量 OPTIND 中。一旦調用了shell , OPTIND 將初始化爲1。當選項以 +開頭,則+ 將預先設爲名稱中的值。

如果選項字符串中的字符後面帶有“:”(冒號),則預期此選項將帶有參數。當選項需要選項參數時,getopts 命令就將其置於變量 OPTARG 中。

當查找到選項字符串所不包含的選項字符,或者查找到的選項沒有所需的選項參數時:

  • 如果選項字符串不以:(冒號)開頭,名稱 將會被設置爲 ?(問號)字符,OPTARG. 將被取消設置,並且診斷消息將被寫入到標準錯誤中。

 

這種情況被認爲是在將參數傳遞給所調用的應用程序的過程中所檢測到的錯誤,而不是在處理 getopts 命令的過程中所發生的錯誤;如上所述,寫入診斷消息,但退出狀態將變爲零。

  • 如果選項字符串以 :(冒號)開頭,名稱 將被設爲 ? (問號)字符,這是對未知的選項來說的,或者爲缺少的所需選項設爲:(冒號)字符,OPTARG 將被設置爲已查找到的選項字符,並且 標準錯誤中將不寫入任何輸出。

 

以下任何字符都可以識別選項結尾:特殊選項- -,查找到不以-,或者+爲開頭的參數,或者遇到錯誤。

當遇到選項結尾時:

  • getopts 命令將退出運行,並且返回值大於零,OPTARG 將被設置爲第一個非選項參數索引,在這種情況下,如果第一個 - - 參數之前未出現其它非選項參數,將認爲它是選項參數,或者如果沒有非選項參數,設置爲值 $#+1,名稱將被設置爲? (問號)字符,

 

參數

選項字符串
包含 getopts 命令識別的選項字符串。如果字符後帶有冒號,則預期選項將帶有參數,應該以單獨參數的形式提供此參數。可以用空格將選項與參數分隔開。如果選項字符是未知的或者選項參數丟失,則選項字符串中的第一個字符將決定 getopts 命令的行爲。

注意:應用程序不應該將問號和冒號字符作爲選項字符。使用其它非字母數字的字符會產生不明的結果。

名稱
由 getopts 命令對查找到的選項字符設置。

參數 ...
一個或多個被空格分隔的字符串,由 getopts 命令校驗是否是合法選項。如果省略參數 ,就使用位置參數。有關位置參數的更多信息,請參見 Korn Shell 中的 參數替換

注意: 一般來說,不必將參數指定爲 getopts 命令的一部分,但在進行腳本調試時可能會有所幫助。

退出狀態

 

此命令返回下列出口值:

0
查找到由選項字符串指定的或未指定的選項。

<0
遇到選項結束或發生錯誤。

示例
  1. 下列 getopts 命令規定 abc 爲有效選項,並且選項 a c 帶有參數:

    getopts a:bc: OPT
  2. 下列 getopts 命令指定 ab 以及 c 爲有效選項, 並且選項 a b 帶有參數,而且 getopts 在命令行遇到爲定義的選項時,它將 OPT 的值設置爲 ?:

    getopts :a:b:c OPT
  3. 下列腳本分析和顯示其參數:

    aflag= bflag=   while getopts ab: name do             
  4.    case $name in            
  5.       a)     aflag=1;;             
  6.       b)     bflag=1    bval="$OPTARG";;             
  7.       ?)     printf"Usage: %s: [-a] [-b value] args\n" $0                           exit 2;;            
  8.    esac done   
  9.  if [ ! -z "$aflag" ]; then           
  10.    printf "Option -a specified\ n" 
  11.   fi   
  12.   if [ ! -z "$bflag" ]; then           
  13.     printf'Option -b "%s" specified\ n' "$bval" fi   shift $(($OPTIND -1)) printf "Remaining arguments are: %s\n" "$*"
在Bash裏有以下用途:

optstring  option 字符串,會逐個匹配
varname    每次匹配成功的選項
arg        參數列表,沒寫時它會取命令行參數列表
$OPTIND    特殊變量,option index,會逐個遞增
$OPTARG    特殊變量,option argument,不同情況下有不同的值


細則1:當optstring以”:“開頭時,getopts會區分invalid option錯誤和miss option argument錯誤。
         invalid option時,varname會被設成?,$OPTARG是出問題的option;
         miss option argument時,varname會被設成:,$OPTARG是出問題的option。
        如果optstring不以”:“開頭,invalid option錯誤和miss option argument錯誤都會使
        varname被設成?,$OPTARG是出問題的option。
細則2:當optstring中的字母跟”:“時,表明該option可接參數,參數(argument)放在$OPTARG中;
        如果缺參數,且optstring是以”:“開頭,則varname的值會是:,$OPTARG是該option,
        否則varname的值是?,$OPTARG是該option。(參照細則1)

例子:gg.sh

[root@localhost shel]# cat gg.sh
#gg.sh
#!/bin/bash
while getopts  "abc:def:ghi" flag
do
  echo "$flag" $OPTIND $OPTARG         # 這裏$OPTIND 是一個索引序列號,$OPTARG 是選項裏所記錄的值,無值是爲空,默認情況下選項是以空格分隔
done
echo "Resetting"
OPTIND=1    while getopts  "abc:def:ghi" flag
do
  echo "$flag" $OPTIND $OPTARG
done

[root@localhost shel]# ./gg.sh -ab -c foo -f "foo bar" -h -gde
a 1 
b 2
c 4 foo
f 6 foo bar
h 7
g 7
d 7
e 8
Resetting
a 1
b 2
c 4 foo
f 6 foo bar
h 7
g 7
d 7
e 8

上面是顯示結果。

如果調整一下所給參數的位置:

[root@localhost shel]# ./gg.sh -abc foo -f "foo bar" -h –gde  a 1
b 1
c 3 foo
f 5 foo bar
h 6
g 6
d 6
e 7
Resetting
a 1
b 1
c 3 foo
f 5 foo bar
h 6
g 6
d 6
e 7

 

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