2012-09-17 38 views
1

我正在编写一个shell脚本来解析选项。它正确地解析选项,但是当我省略任何输入参数时,它不会从while循环中出来。 任何人都可以帮忙吗?Getopt in shell

TEMP=`getopt -o ha:b:d:e:c: --l ca: \-n "$x" -- "[email protected]"` 

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循环了。

回答

0

你永远不会退出循环;你如何期望退出发生?一个常见的安排是检查顶部的$#,并且只有在zonzero时才进行。

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" -- "[email protected]") 

通常,$(...)表示法比反标号更可取。

+0

This works。但是我所有的输入参数都是'arg1'而不是arg1。任何解决方案? – user1558886

+0

道歉:我错过了'set'前面的'eval'。我已经更新了包含它的答案。 –

+0

非常感谢... – user1558886