1

我正在使用以下脚本:

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

你可以看到它失败了。似乎 while 不工作。解决它的最佳方法是什么。

4

3 回答 3

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.
于 2010-11-26T18:37:20.407 回答
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 选项的情况共享它。

于 2010-11-26T18:54:52.960 回答
0

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

于 2010-11-26T18:34:37.860 回答