在bash中检查getopts状态的最佳方法是什么?

时间:2010-11-26 18:15:11

标签: bash getopts

我正在使用以下脚本:

#!/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

你可以看到它失败了。它似乎虽然不起作用。解决问题的最佳方法是什么?

3 个答案:

答案 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)

“最佳”解决方案是主观的。一种解决方案是为那些可以通过选项设置的变量提供默认值。