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
如果option_string不用:開頭,invalid option錯誤和miss option argument錯誤都會使varname被設成?。
getopts包含兩個內建變數,OPTARG和OPTIND
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模式下獲取引數的方法》