2013-04-30 170 views
0

我正在編寫一個Bash腳本,它接受命令行參數,但不是一次一個,而是每次都使用一個case語句。使用多個參數的bash腳本

這裏是我到目前爲止的代碼

while [ $# -gt 0 ] 
do 
    case "$1" in 
     -n|--name) 
      name="$2" 
     ;; 
     -s|--size) 
      size="$2" 
     ;; 
     -l|--location) 
      location="$2" 
     ;; 
    esac 
done 

此代碼只接受一次一個,我需要它能夠指定多達他們想要的。

+3

查看'shift'手冊。另外看看'getopts',這是正確的方法 – 2013-04-30 00:50:15

回答

4

當使用getopt你能解決你的任務如下:

OPTS=`getopt -o n:s:l: --long name:,size:,location: -- "[email protected]"` 
eval set -- "$OPTS" 

這分裂原位置參數代入選項(即帶參數,用冒號表示),其餘的參數,這兩者可能會被引用。之後評估getopt的結果,並且set -- $OPTS將位置參數$1,$2,$3,...設置爲getopt獲得的結果。之後,我們可以循環訪問位置參數(並在我們遇到--時立即停止,該選項將選項與腳本的其餘參數分開)。

while true 
do 
    case "$1" in 
    -n|--name) 
     name="$2" 
     shift 2 
     ;; 
    -s|--size) 
     size="$2" 
     shift 2 
     ;; 
    -l|--location) 
     location="$2" 
     shift 2 
     ;; 
    --) 
     shift 
     break 
     ;; 
    *) 
     echo "Internal error!" 
     exit 1 
    esac 
done 

echo -e "name: $name\nsize: $size\nlocation: $location"