1

我正在编写一个 shell 脚本来解析选项。它正确解析了选项,但是当我省略任何输入参数时,它不会出现在 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

您也不需要变量$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 回答