1

オプションを解析するシェルスクリプトを書いています。オプションを正しく解析しますが、入力引数を省略すると、while ループから抜け出しません。誰でもこれについて助けることができますか?

TEMP=`getopt -o ha:b:d:e:c: --l ca: \-n "$x" -- "$@"`

eval set -- "$TEMP"

while true; do

  case "$1" in

    -h)      print $USAGE
             exit 0 ;;
    -a)      case "$2" in
               -*|"") error "Option t, requires argument";
                      exit 1;;

               *)  print $2
                   T=${2^^} ; 
                   shift 2 ;;
             esac ;;

    -b)      case "$2" in
               -*|"") error "Option p, requires argument";
                   exit 1 ;;

               *)  print $2
                   PE=${2^^} ; 
                   shift 2 ;
             esac ;;

    -d)      case "$2" in
               -*|"") error "Option f, requires argument";
                      exit 1 ;;

               *)  print $2 ; 
                   IN=$2 ;
                   shift 2 ;;
             esac ;;

    -e)      case "$2" in
               ""|-*) error "Option e, requires argument";
                      exit 1 ;;

               *)  print  $2 ; 
                   KEY=$2 ;
                   shift 2 ;;
             esac ;;
    -c|--ca) case "$2" in
               ""|-*) error "Option c, requires argument"; 
                   exit 1;;

               *)  print $2 ;
                   C=${2};
                   shift 2 ;;
             esac ;;


   --)       shift ;
             break ;;

    *)       error "Invalid Input!" ;
             exit 1 ;;

  esac
done


USAGE:foo.sh -a arg1 -b arg2 -c arg3 -d arg 4 -e arg5

これはうまくいきますが、

foo.sh -a arg1 -b arg2 -c arg3

while ループから出ません。

4

2 に答える 2

2

getopt組み込みの の代わりに使用する場合getopts、ループ条件は次のようになります。

while [ $# -gt 0 ]
do
    case "$1" in
    ...
    esac
done

variable も必要ありません$TEMP。あなたは単に使用することができます:

eval set -- $(getopt -o ha:b:d:e:c: --l ca: \-n "$x" -- "$@")

一般に$(...)、バックティックよりも記法の方が適しています。

于 2012-09-18T04:47:58.343 に答える
0

ループを終了することはありません。どのように出口が起こると思いますか?一般的な取り決めは$#、上部で調べて、zonzero の場合にのみ続行することです。

于 2012-09-18T04:49:11.310 に答える