我需要寫一個bash腳本,並想將其解析無序參數格式的:bash腳本參數
scriptname --param1 <string> --param2 <string> --param3 <date>
有沒有一種簡單的方法來做到這一點,還是我漂亮與1美元,2美元,3美元?
我需要寫一個bash腳本,並想將其解析無序參數格式的:bash腳本參數
scriptname --param1 <string> --param2 <string> --param3 <date>
有沒有一種簡單的方法來做到這一點,還是我漂亮與1美元,2美元,3美元?
你想要getopts。
如前所述,Bash具有getops函數,可以解決您的問題。如果你需要更復雜的東西,bash也支持位置參數(訂購$ 1 ... $ 9,然後$ {10} .... $ {n}),你將不得不自己想出處理這種輸入的邏輯。一個簡單的方法是在for循環中放置一個switch/case,迭代參數。您可以使用處理輸入的兩個特殊bash變量之一:$* or [email protected]。
while [[ $1 = -* ]]; do
arg=$1; shift # shift the found arg away.
case $arg in
--foo)
do_foo "$1"
shift # foo takes an arg, needs an extra shift
;;
--bar)
do_bar # bar takes no arg, doesn't need an extra shift
;;
esac
done
如何實現由側短&長開關側一個很好的例子是mcurl:
#!/bin/bash
# Parse the command-line arguments
while [ "$#" -gt "0" ]; do
case "$1" in
-p1|--param1)
PARAM1="$2"
shift 2
;;
-p2|--param2)
PARAM2="$2"
shift 2
;;
-p3|--param3)
PARAM3="$2"
shift 2
;;
-*|--*)
# Unknown option found
echo "Unknown option $1."
exit 1
;;
*)
CMD="$1"
break
;;
esac
done
echo "param1: $PARAM1, param2: $PARAM2, param3: $PARAM3, cmd: $CMD"
當我執行這樣的:
./<my-script> --param2 my-param-2 --param1 myparam1 --param3 param-3 my-command
它輸出你期望什麼:
param1: myparam1, param2: my-param-2, param3: param-3, cmd: my-command
getopts不支持長開關(以 - 開頭)。 getopt可以,但使用/閱讀非常可怕 – Cameron 2009-05-06 02:56:08
好點 - 如果長開關是必須的,getopts不是正確的工具。 – 2009-05-06 03:00:14