2014-05-25 45 views
1

我不得不做出一個名爲test.sh看起來像下面外殼:getopts的兩個參數選項將停止腳本

while getopts a:b: opt 
do 
    case $opt in 
    a) a1=$OPTARG 
     ;; 
    b) b1=$OPTARG  
     eval "b2=\${$OPTIND}" 
     shift 2;; 

    esac 
done 

echo $a1; 
echo $b1; 
echo $b2; 

當我嘗試下面的命令,它的工作腳本...

test.sh -a 111 -b 222 333 

111 
222 
333 

但如果我嘗試這個...

test.sh -b 222 333 -a 111 

222 
333 

它只能顯示-b參數,-a選項和agrument後無法-b選項工作... ...

在我的腳本有任何問題???? 謝謝:)

回答

1

修改參數索引shift 2不會與getopts一起玩。相反,你應該用一個遞增OPTIND獲得getopts跳到下一個參數,例如像

while getopts a:b: opt 
do 
     case $opt in 
       a) a1=$OPTARG 
         ;; 
       b) b1=$OPTARG  
         eval "b2=\${$OPTIND}" 
         OPTIND=`echo $OPTIND + 1 | bc` 
         ;; 
     esac 
done 

echo $a1; 
echo $b1; 
echo $b2; 
+3

'申報 「B2 = $ OPTIND」'和'OPTIND = $((OPTIND + 1))'將是可取的(前者通常比較安全,並且不比在這裏使用'eval'更糟;後者對於整數算術更有效)。 – chepner

+0

謝謝,如果我想再添加一個參數$ b3,我該怎麼辦? – YOHO