2013-08-01 62 views
0

我給陣列作爲參數傳遞給這樣的功能:殼牌腳本數組語法

declare -a my_array=(1 2 3 4) 
my_function (????my_array) 

我想要的陣列被傳遞給函數,正如一個陣列,而不是作爲4個獨立的參數。然後在功能,我想通過像數組遍歷:

(以創建my_function)

for item in (???) 
do 
.... 
done 

什麼應該是正確的語法(???)。

+1

你想要的「$ @」如果這是bash的。看[這個問題](http://stackoverflow.com/questions/255898/how-to-iterate-over-arguments-in-bash-script)。 – Troy

+0

@Troy我的參數是一個數組(單個參數)。看起來它不同於幾個參數的組合 –

回答

1

bash沒有數組文字的語法。您顯示的內容(my_function (1 2 3 4))是語法錯誤。您必須使用

  • my_function "(1 2 3 4)"
  • my_function 1 2 3 4

一個第一:

my_function() { 
    local -a ary=$1 
    # do something with the array 
    for idx in "${!ary[@]}"; do echo "ary[$idx]=${ary[$idx]}"; done 
} 

對於第二,只需使用"[email protected]"或:

my_function() { 
    local -a ary=("[email protected]") 
    # do something with the array 
    for idx in "${!ary[@]}"; do echo "ary[$idx]=${ary[$idx]}"; done 
} 

一個不情願的編輯...

my_function() { 
    local -a ary=($1) # $1 must not be quoted 
    # ... 
} 

declare -a my_array=(1 2 3 4) 
my_function "${my_array[#]}"  # this *must* be quoted 

這依賴於你的數據不包含空格。例如,這將不起作用

my_array=("first arg" "second arg") 

你想通過2個元素,但是你會收到4強制轉換數組轉換成字符串,然後再擴展它是充滿了危險。

你可以用間接變量做到這一點,但他們是醜陋與陣列

my_function() { 
    local tmp="${1}[@]"  # just a string here 
    local -a ary=("${!tmp}") # indirectly expanded into a variable 
    # ... 
} 

my_function my_array   # pass the array *name* 
+0

嗨,感謝您的回覆。它工作得很好。但是,我遇到了另一個問題。我已經更新了我原來的帖子。你可以看看:> Bash對我來說很新,有時候我只是陷入了一些簡單的問題:> –

+0

這似乎是一個任意的要求。爲什麼用這種方式來限制自己,當它讓你的生活變得更難? –

+0

是的。你說得對。無論如何非常感謝您的答覆。看起來非常好。 –