2017-06-14 86 views
3

我有一個超過400個座標,我想作爲參數傳遞給一個字符串,但我不知道如何將第一個參數作爲「經緯度」和第二個參數作爲「 lng「等等。遍歷命令行參數對

說我是路過這個

./test 1 2 3 4 

我希望我的輸出是

coordinate: {lat: 1, lng: 2} 
coordinate: {lat: 3, lng: 4} 

這是我到目前爲止,但顯然這不是它是如何做。

for i in [email protected] 
do 

    echo "coordinate: {lat: $i, lng: $i}" 

done 
+0

順便說一句,'for i in $ @'實際上很麻煩 - 它會把'./yourscript「一二」「三四」'和'./yourscript「一樣」 「兩」「三」「四」「。總是引用'「$ @」'。 –

回答

4
#!/usr/bin/env bash 
while (("$#" >= 2)); do 
    echo "coordinate: {lat: $1, lng: $2}" 
    shift 2 
done 

注意shift; shift在許多圈子優於shift 2,因爲它的工作原理即使只剩下一個論點, shift 2僅僅是因爲我們比較$#以確保始終有兩個或更多參數。

+0

謝謝先生,這真的很有幫助。 –

0

你可以使用shift(但不要做這樣的 - 見下面的評論):

while [ -n "$1" ] 
do 
    echo "{coordinate: {lat: $1, lng $2}" 
    shift 2 
done 
+0

這將空字符串視爲不存在的參數 - './scriptname「」「」three four'將永遠不會到達「three' /'four'對。 –

+0

另外,如果你有一個奇數的參數,'shift 2'可以是一個noop(返回一個非零退出狀態,但根本沒有任何作用,將現有值留在$ 1中),導致無限循環。 –

+0

@CharlesDuffy好的,謝謝 –

3

你並不需要一個循環:

printf "coordinate: {lat: %s, lng: %s}\n" "[email protected]" 

,並把您的路徑之前重命名您的腳本(像在/ usr/local/bin目錄),因爲test是一個內置函數。

+1

我真的很尷尬,我錯過了這一點;你完全正確。 –