2012-09-17 65 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