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

あなたはそれが失敗するのを見ることができます。動作していないようです。それを解決するための最良の方法は何ですか。

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

「最良の」ソリューションは主観的なものです。1 つの解決策は、オプションで設定できる変数にデフォルト値を与えることです。

于 2010-11-26T18:34:37.860 に答える