2009-05-06 139 views
11

我需要寫一個bash腳本,並想將其解析無序參數格式的bash腳本參數

scriptname --param1 <string> --param2 <string> --param3 <date> 

有沒有一種簡單的方法來做到這一點,還是我漂亮與1美元,2美元,3美元?

回答

10

你想要getopts

+5

getopts不支持長開關(以 - 開頭)。 getopt可以,但使用/閱讀非常可怕 – Cameron 2009-05-06 02:56:08

+0

好點 - 如果長開關是必須的,getopts不是正確的工具。 – 2009-05-06 03:00:14

1

如前所述,Bash具有getops函數,可以解決您的問題。如果你需要更復雜的東西,bash也支持位置參數(訂購$ 1 ... $ 9,然後$ {10} .... $ {n}),你將不得不自己想出處理這種輸入的邏輯。一個簡單的方法是在for循環中放置一個switch/case,迭代參數。您可以使用處理輸入的兩個特殊bash變量之一:$* or [email protected]

8
while [[ $1 = -* ]]; do 
    arg=$1; shift   # shift the found arg away. 

    case $arg in 
     --foo) 
      do_foo "$1" 
      shift   # foo takes an arg, needs an extra shift 
      ;; 
     --bar) 
      do_bar   # bar takes no arg, doesn't need an extra shift 
      ;; 
    esac 
done 
0
#!/bin/bash 

# Parse the command-line arguments 
while [ "$#" -gt "0" ]; do 
    case "$1" in 
    -p1|--param1) 
     PARAM1="$2" 
     shift 2 
    ;; 
    -p2|--param2) 
     PARAM2="$2" 
     shift 2 
    ;; 
    -p3|--param3) 
     PARAM3="$2" 
     shift 2 
    ;; 
    -*|--*) 
     # Unknown option found 
     echo "Unknown option $1." 

     exit 1 
    ;; 
    *) 
     CMD="$1" 
     break 
    ;; 
    esac 
done 


echo "param1: $PARAM1, param2: $PARAM2, param3: $PARAM3, cmd: $CMD" 

當我執行這樣的:

./<my-script> --param2 my-param-2 --param1 myparam1 --param3 param-3 my-command 

它輸出你期望什麼:

param1: myparam1, param2: my-param-2, param3: param-3, cmd: my-command