2012-03-16 75 views
1

我想一個數組參數傳遞給在bash的功能,並編寫一些測試代碼:如何使用數組作爲函數變量在bash

#!/bin/sh 

    function foo { 
     a=$1; 
     for i in ${a[@]} ; do 
      echo $i 
     done 
    } 
    names=(jim jerry jeff) 
    foo ${names[@]} 

上面的代碼只是顯示吉姆,而不是三Ĵ*。所以我的問題是:

  • 爲什麼我的代碼不工作
  • 什麼做

回答

1

例如像這樣的正確方法:

my_array[0]="jim" 
my_array[1]="jerry" 

function foo 
{ 
    #get the size of the array 
    n=${#my_array[*]} 
    for ((Idx = 0; Idx < $n; ++Idx )); do 
      echo "${my_array[$Idx]}" 
    done 
} 
+0

感謝,但我想要得到的陣列,以防止原來被改變 – 2012-03-16 07:50:11

+0

你嘗試將其與「$」像傳遞給函數的本地副本:FOO $ {}的名字? – sirgeorge 2012-03-16 07:54:08

+0

yeeeeeeeeeeeees – 2012-03-16 07:55:30

2
#!/bin/bash 
function foo { 
a=($*) 
for i in ${a[@]} 
do 
    echo $i 
done 
} 

names=(jim jerry jeff) 
foo ${names[@]} 

你代碼沒有向我顯示jim,而是字面上的「名稱」。你必須通過整個陣列。你必須用a=$($)重新奪回它。

關於數組的bash中的manpage部分相當長。我只舉一個句子:

引用數組變量沒有標相當於引用數組的0

+0

謝謝,我糾正了錯誤 – 2012-03-16 08:27:30

+1

@HaiyuanZhang:btw .:當使用bash時,使用Bash-Shebang。 – 2012-03-16 14:14:25

2

標你是相當接近;最大的問題是命令a=$1,它只分配第一個參數($1)到a,而您想分配整個參數列表([email protected]),並將其分配爲數組而不是字符串。我糾正的其他事情:每當你使用變量時,你應該在變量周圍使用雙引號,以避免與特殊字符(例如空格)混淆。並用#!/bin/bash啓動腳本,因爲數組是bash擴展名,並不總是在品牌-X shell中可用。

#!/bin/bash 

function foo { 
    a=("[email protected]") 
    for i in "${a[@]}" ; do 
     echo "$i" 
    done 
} 

names=(jim jerry jeff "jim bob") 
foo "${names[@]}"