将数组传递给Shell脚本函数

4
如何在shell脚本中将数组作为函数传递?
我编写了以下代码:
function test(){
param1 = $1
param2 = $2
for i in ${$param1[@]}
do
   for j in ${param2[@]}
do
       if($(i) = $(j) )
           then
           echo $(i)
           echo $(j)
       fi
done
done
}

但是我遇到了line 1: ${$(param1)[@]}: bad substitution的问题。

3个回答

18

有多个问题:

  • 在赋值变量时,=左右不能有空格。
  • 你的if语句语法错误。
  • 数组传递方式不正确。
  • 尽量不要把函数命名为test,因为这是一个shell命令。

下面是修复后的版本:

myFunction(){
  param1=("${!1}")
  param2=("${!2}")
  for i in ${param1[@]}
  do
    for j in ${param2[@]}
    do
       if [ "${i}" == "${j}" ]
       then
           echo ${i}
           echo ${j}
       fi
    done
  done
}

a=(foo bar baz)
b=(foo bar qux)
myFunction a[@] b[@]

程序可运行,但不会循环。param1仅包含数组的第一个索引。param1[0]。 - Vivek Goel
我正在调用myFunction $p1 $p2,其中$p1的大小为65。 - Vivek Goel
@vivek-goel 我已经更新了我的答案并添加了一个示例函数调用。 - dogbane
a=(foo bar baz) b=(foo bar qux) myFunction a[@] b[@] 如果我回显 i,则会输出 a[@]。 目前我正在使用以下方式argument=echo ${a[@]} 这种方法有效。 - Vivek Goel

0
您可以根据需要使用以下脚本。
#!/bin/bash

param[0]=$1
param[1]=$2


function print_array  {
        array_name=$1
        eval echo \${$array_name[*]}
        return
}

print_array param
exit 0

0

一个简单的方法:

function iterate 
{
  n=${#detective[@]}
  for (( i=0; i<n; i++ ))
  do
    echo ${detective[$i]}
  done
}

detective=("Feluda" "Sharlockhomes" "Bomkesh" )
iterate ${detective[@]}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接