我正在使用以下脚本:
#!/bin/bash
#script to print quality of man
#unnikrishnan 24/Nov/2010
shopt -s -o nounset
declare -rx SCRIPT=${0##*/}
declare -r OPTSTRING="hm:q:"
declare SWITCH
declare MAN
declare QUALITY
if [ $# -eq 0 ];then
printf "%s -h for more information\n" "$SCRIPT"
exit 192
fi
while getopts "$OPTSTRING" SWITCH;do
case "$SWITCH" in
h) printf "%s\n" "Usage $SCRIPT -h -m MAN-NAME -q MAN-QUALITY"
exit 0
;;
m) MAN="$OPTARG"
;;
q) QUALITY="$OPTARG"
;;
\?) printf "%s\n" "Invalid option"
printf "%s\n" "$SWITCH"
exit 192
;;
*) printf "%s\n" "Invalid argument"
exit 192
;;
esac
done
printf "%s is a %s boy\n" "$MAN" "$QUALITY"
exit 0
如果我给的是垃圾选项:
./getopts.sh adsas
./getopts.sh: line 32: MAN: unbound variable
你可以看到它失败了。它似乎虽然不起作用。解决问题的最佳方法是什么?
答案 0 :(得分:2)
当没有选项参数时,getopts
内置函数返回1(“false”)。
因此,除非您的选项参数以while
开头,否则您的-
永远不会执行。
注意bash(1)的getopts部分中的最后一段:
getopts returns true if an option, specified or unspecified, is
found. It returns false if the end of options is encountered or
an error occurs.
答案 1 :(得分:1)
如果你绝对需要MAN,那么我建议你不要把它作为一个选项参数,而是一个位置参数。选项应该是可选的。
但是,如果您想将其作为选项,请执行以下操作:
# initialise MAN to the empty string
MAN=
# loop as rewritten by DigitalRoss
while getopts "$OPTSTRING" SWITCH "$@"; do
case "$SWITCH" in
m) MAN="$OPTARG" ;;
esac
done
# check that you have a value for MAN
[[ -n "$MAN" ]] || { echo "You must supply a MAN's name with -m"; exit 1; }
更好的是,在退出之前打印用法消息 - 将其拉出到一个函数中,这样你就可以用-h选项的情况共享它。
答案 2 :(得分:0)
“最佳”解决方案是主观的。一种解决方案是为那些可以通过选项设置的变量提供默认值。