1. 程式人生 > >Linux 使用getopts命令獲取命令列引數

Linux 使用getopts命令獲取命令列引數

Linux getopts命令用於獲取命令列中的引數

呼叫格式:

getopts option_string variable

 
引數說明:
option_string 選項名稱
variable 選項的值
 
選項之間使用冒號:分隔,也可以直接連線, : 表示選項後面有傳值。
當getopts命令發現冒號後,會從命令列該選項後讀取該值。如該值存在,將儲存在特殊的變數OPTARG中。

當option_string用:開頭,getopts會區分invalid option錯誤和miss option argument錯誤。

invalid option時, varname會被設成?
miss option argument

時,varname會被設成:

如果option_string不用:開頭,invalid option錯誤和miss option argument錯誤都會使varname被設成?。


getopts包含兩個內建變數,OPTARGOPTIND

OPTARG 儲存選項後的引數值
OPTIND 表示命令列下一個選項或引數的索引

例子1,使用getopts命令獲取引數

#!/bin/bash

while getopts a:b:c:d opts; do
    case $opts in
        a) a=$OPTARG ;;
        b) b=$OPTARG ;;
        c) c=$OPTARG
;; d) d=$OPTARG ;; ?) ;; esac done echo "a=$a" echo "b=$b" echo "c=$c" echo "d=$d" exit 0

執行輸出

./test.sh -a 1 -b 2 -c 3 -d 4
a=1
b=2
c=3
d=

option_string a:b:c:d
a,b,c後都有:,d後沒有:
所以可以獲取到a,b,c的值

例子2,option_string前加:

上例中,如果a,b,c任意一個沒有傳值,將會提示出錯。例如 -c 不傳值。

./test.sh -a 1 -b 2
-c ./test.sh: option requires an argument -- c a=1 b=2 c= d=

我們在option_string前加上:,則可以遮蔽這個錯誤。

#!/bin/bash

while getopts :a:b:c:d opts; do
    case $opts in
        a) a=$OPTARG ;;
        b) b=$OPTARG ;;
        c) c=$OPTARG ;;
        d) d=$OPTARG ;;
        ?) ;;
    esac
done

echo "a=$a"
echo "b=$b"
echo "c=$c"
echo "d=$d"

exit 0

執行輸出

./test.sh -a 1 -b 2 -c
a=1
b=2
c=
d=

在option_string前加上:,可以遮蔽缺失傳值的錯誤,但如果缺失的是前面選項的值,那麼獲取到的值將會錯誤。

例如缺失a的傳值,命令會把-a後的-b作為了-a的值,導致錯誤。

./test.sh -a -b 2 -c 3
a=-b
b=
c=
d=

因此使用getopts命令時,對於沒有傳值的選項,選項名稱也不要加入命令列中。
例如a不傳值,則-a不要加入命令列。

./test.sh -b 2 -c 3
a=
b=2
c=3
d=



Linux的getopts命令並不支援多個字元組合的引數名稱(longopts),如需要獲取long opts引數,可以使用php的getopt方法實現,參考:《php cli模式下獲取引數的方法》