2014-03-01 222 views
0

我有一個bash腳本,我想這樣的呼籲:多個參數傳遞給bash腳本

bash curl.sh http://www.google.co.uk/ -d Directory -a "Moz 123" -r http://localhost/ 

我可以收集第一個參數(http://www.google.co.uk/),有以下幾點:

url=$1 
while getopts p:d:a:r: opt; do 
case $opt in 
    p) proxy=$OPTARG ;; 
    d) dir=$OPTARG ;; 
    a) ua=$OPTARG ;; 
    r) ref=$OPTARG ;; 
esac 
done 

然而,它並沒有拿起其他的參數。如果我刪除'http://www.google.co.uk/'作爲第一個參數,它會提取-arguments。

由於物流的原因,我無法設置第一個參數,例如'http://www.google.co.uk/'與-u等

你如何得到這個工作?

回答

1

在我而言,這似乎是最好的選擇:

調用腳本,如:

bash curl.sh -d Remote -a "Moz 123" -r http://localhost http://www.google.com/ 

你可以選擇最後一個參數就像:

url=${!#} 

然後其他選項使用getopts,如上。

1

getopts只要看到一個不以連字符開頭的參數,就會停止解析。您必須更改傳遞參數的順序,或者使用GNU版本的外部程序getopt,該程序可以處理與選項混合的常規參數。

我認爲以下應該工作(它的模擬您的代碼和http://linuxaria.com/howto/parse-options-in-your-bash-script-with-getopt?lang=en示例)。本質上,getopt只是重新排列參數並拆分任何組合選項(如將-xyz更改爲-x -y -z)。任何非可選參數將在解析的選項列表中的--之後找到。

PARSED_OPTIONS=$(getopt -o "p:d:a:r:" -- "[email protected]") 
eval set -- "$PARSED_OPTIONS" 
while true; do 
    case $1 in 
     p) proxy=$2; shift 2 ;; 
     d) dir=$2; shift 2 ;; 
     a) ua=$2; shift 2 ;; 
     r) ref=$2; shift 2;; 
     --) shift; break ;; 
    esac 
done 
+0

你能夠引用一些代碼,我可以看到這與常規參數和選項一起使用嗎? –

3

爲什麼不傳入參數,用引號括起來?

例如

script.shl "http://www.google.com" "/var/www/test" "option 3" 

...那麼你可以直接在腳本中使用$ 1 $ 2 $ 3來訪問它們。你仍然可以通過使用if ... else來改變腳本的過程。

除非,我已經錯讀你的問題......

+0

有多個選項可以傳遞給腳本,有時我不會全部使用它們。所以我要求通過他們,如:-a -b –

+1

啊,雖然你總是可以傳遞一個空參數? script.shl「www,google.com」「NULL」「選項3」。然後,只要添加一個子句來忽略如果「NULL」被發現... – user3360167

+2

這不能很好地適合可能有許多可選參數的程序。你不需要像'script.shl「」「foo」「」「」「bar」「」「」「」「3」「」「4」'這樣的程序。 – chepner