2012-10-03 93 views
94

如何將命令行參數轉換爲bash腳本數組?在Bash中將命令行參數轉換爲數組

我想借此:

./something.sh arg1 arg2 arg3 

並將其轉換爲

myArray=(arg1 arg2 arg3) 

,這樣我可以用myArray的爲腳本中的進一步使用。

此之前的SO後接近,但不進入如何創建一個數組:How do I parse command line arguments in Bash?

我需要的參數轉換爲常規bash腳本陣列;我意識到我可以使用其他語言(例如Python),但需要在bash中執行此操作。我想我正在尋找一個「追加」功能或類似的東西?

更新:我也想問如何檢查零個參數,並指定一個默認的數組值,並且由於下面的答案,能得到這個工作:

if [ "$#" -eq 0 ]; then 
    myArray=(defaultarg1 defaultarg2) 
else 
    myArray=("[email protected]") 
fi 

回答

126

其實你的命令行參數實際上是就像一個數組已經。至少,你可以將[email protected]變量看作一個數組。這就是說,你可以將其轉換爲實際的數組是這樣的:

myArray=("[email protected]") 

如果你只是想輸入一些參數並將其送入[email protected]值,使用set

$ set -- apple banana "kiwi fruit" 
$ echo "$#" 
3 
$ echo "[email protected]" 
apple banana kiwi fruit 

瞭解如何使用參數結構在POSIX sh中是特別有用的,它沒有其他任何數組。

+1

謝謝!很棒!正要問如何檢查零參數並分配一個默認數組值,而$#完全適用於此! – Suman

+0

@kojiro set的含義是什麼 - ,謝謝 – mailzyok

+1

'set'允許你爲範圍設置位置參數。它還可以讓你設置shell選項。你可以執行'set foo',這意味着'$ 1'擴展爲'foo',但是如果你的參數以'set'開頭,將假定你的意思是設置一個shell選項。雙短劃線確保將以下所有參數解釋爲要設置的位置參數。 – kojiro

35

也許這可以幫助:

myArray=("[email protected]") 

,你也可以通過參數迭代通過省略 '在':

for arg; do 
    echo "$arg" 
done 

將相當於

for arg in "${myArray[@]}"; do 
    echo "$arg" 
done 
+0

我發現第二個很棒 – goofansu

+0

新手問題:bash如何知道將什麼放入'arg'字段 - 它是一個預定義的變量嗎? '$ {var}'被擴展爲'var'的內容。 '$ {var [n]}'被擴展到數組'var'的元素'n'的內容。 '$ {var {@]}'然後展開整個數組,例如'$ {var [0]} $ {var [1]} ... $ {var [n]}'(用'n'作爲最後一個元素的索引)? – Christian

+0

[for] without [in]將循環參數數組$($ 1,$ 2等)。也可以用[set]命令設置,例如set - arg1 arg2 –

4

這裏是另一個用法:

#!/bin/bash 
array=("[email protected]") 
arraylength=${#array[@]} 
for ((i=1; i<${arraylength}+1; i++)); 
do 
    echo "${array[$i-1]}" 
done 
6

其實參數列表可以用$1 $2 ...等來訪問
這是完全等同於:

${!i} 

因此,參數列表可以用一組被改變,
${!i}是訪問它們的正確方法:對於

$ set -- aa bb cc dd 55 ff gg hh ii jjj kkk lll 
$ for ((i=0;i<=$#;i++)); do echo "$#" "$i" "${!i}"; done 
12 1 aa 
12 2 bb 
12 3 cc 
12 4 dd 
12 5 55 
12 6 ff 
12 7 gg 
12 8 hh 
12 9 ii 
12 10 jjj 
12 11 kkk 
12 12 lll 

您具體而言,這可以用來(無需陣列),設定的參數列表給出無時:

if [ "$#" -eq 0 ]; then 
    set -- defaultarg1 defaultarg2 
fi 

它轉換爲這種更簡單的表達:

[ "$#" == "0" ] && set -- defaultarg1 defaultarg2 
4

更容易不過,你可以在[email protected]直接操作;)

這裏是如何做到直接從提示通過參數的個數AA名單:

function echoarg { for stuff in "[email protected]" ; do echo $stuff ; done ; } 
echoarg Hey Ho Lets Go 
    Hey 
    Ho 
    Lets 
    Go