2012-03-16 48 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[@]}"