2014-05-25 48 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