2013-03-14 43 views
9
#!/bin/bash 
COUNTER=$# 
until [ $COUNTER -eq 0 ]; do 
args[$COUNTER]=\$$COUNTER 
let COUNTER-=1 
done 
echo ${args[@]} 

當我運行它,我得到下面的結果從數量的參數創建循環數組

[email protected]:~/sandbox# ./script.sh first second third 
$1 $2 $3 

,我很期待它呼應了什麼$ 1,$ 2,$ 3不是的「$ 1」

文本值我試圖寫在bash腳本,將創建一個數組,它是論點我給它數的大小。
我期待

[email protected]:~/sandbox# ./script.sh alpha bravo charlie 
alpha bravo charlie 

[email protected]:~/sandbox# ./script.sh 23425 jasson orange green verb noun coffee 
23425 jasson orange green verb noun coffee 

所以,我們的目標是使

args[0]=$1 
args[1]=$2 
args[2]=$3 
args[3]=$4 

,我有它的$1,$2,$3沒有被插入的方式,但只是作爲文本字符串閱讀。

回答

22

可以使用+=運營商要追加到一個數組。

args=() 
for i in "[email protected]"; do 
    args+=("$i") 
done 
echo "${args[@]}" 

這顯示瞭如何追加可以做到,但要獲得您想要的結果的最簡單的方法是:

echo "[email protected]" 

args=("[email protected]") 
echo "${args[@]}" 

如果你想保持現有的方法,您需要使用indirection!

args=() 
for ((i=1; i<=$#; i++)); do 
    args[i]=${!i} 
done 

echo "${args[@]}" 

從擊參考:(!)

如果參數的第一個字符是一個感嘆號,引入可變了一個間接 水平。 bash使用從參數作爲 變量的名稱的其餘部分形成的的 可變值;然後展開此變量,並將該值用於其餘替換中的 ,而不是參數本身的值。 這被稱爲間接擴展。例外情況是 擴展的$ {!前綴}和$ {!名稱[@]}如下所述。該 感嘆號必須緊跟在左大括號,以 引入間接。

+0

是的,這也正是它。感謝您的及時回覆。我仍然對腳本有點小白。像往常一樣+1 – spezticle 2013-03-14 22:03:15

+1

+1。僅供參考,對我來說''我''可以是一個顯着的優化,因爲我在大多數shell中都是「$ @」'(幾乎不值一提,但我認爲我以前見過你這樣寫過)。 – ormaaj 2013-03-14 22:37:18