在我的bash腳本中,我想使用getopts
來解析命令行選項。如何讓bash getopts無法將option選項作爲選項參數
我第一次嘗試,學習如何使用它,如下所示:
#!/bin/bash
v_option_arg=""
r_option_arg=""
h_option_arg=""
function get_opt_args() {
while getopts ":v:r:h:" opt
do
case $opt in
"v")
v_option_arg="$OPTARG"
;;
"h")
h_option_arg="$OPTARG"
;;
"r")
r_option_arg="$OPTARG"
;;
"?")
echo "Unknown option -$OPTARG"
exit 1
;;
":")
echo "No argument value for option -$OPTARG"
;;
*)
# Should not occur
echo "Unknown error while processing options"
;;
esac
done
shift $((OPTIND-1))
}
get_opt_args [email protected]
if [ ! -z "$v_option_arg" ]; then
echo "Argnument value for option -v: $v_option_arg"
fi
if [ ! -z "$r_option_arg" ]; then
echo "Argnument value for option -r: $r_option_arg"
fi
if [ ! -z "$h_option_arg" ]; then
echo "Argnument value for option -h: $h_option_arg"
fi
$ bash testopts.sh -v 1
Argnument value for option -v: 1
$ bash testopts.sh -r 2
Argnument value for option -r: 2
$ bash testopts.sh -h 3
Argnument value for option -h: 3
$ bash testopts.sh -v 1 -r 2 -h 3
Argnument value for option -v: 1
Argnument value for option -r: 2
Argnument value for option -h: 3
$ bash testopts.sh -v
No argument value for option -v
$ bash testopts.sh -a
Unknown option -a
這似乎能夠成功。
接下來,我省略參數測試我的腳本的健壯性:
$ bash testopts.sh -v -r 2
Argnument value for option -v: -r
這不是我所期待的。我怎樣才能區分一個選項和一個選項參數的差異?
我想讓我的腳本更健壯,這樣如果有一個選項沒有它的參數,我可以發出一個合適的錯誤信息。
注意:每個選項都必須有一個選項參數。
我可以用getopts
這麼做嗎?
您將-v選項聲明爲需要參數。所以'getopt'認爲'-r'是選項'-v'的強制參數。如果你想讓'-v'有一個可選的參數,在optstring中使用'v ::'而不是'v:'。 –
@RenaudPacalet'::'行爲是GNU擴展,而不是POSIX標準。 – rojomoke
@rojomoke你說得對。 –