当第一个参数是Bash中的数组时,访问第二个func参数

时间:2019-02-21 20:34:09

标签: bash

如果我具有带有两个或多个参数的bash函数,并且第一个是数组,那么如何访问第二个参数?

它与此question相同,但是非数组参数是此处的第一个参数,而我的不是(因此它无法回答我的问题)。

function getParam() {
   arr=("$@")
   for i in "${arr[@]}";
   do
      echo $i #works - print array item
   done

   var=$2
   echo $var #not working - returns two; I want 3
}

array=('one' 'two' 'three')

getParam "${array[@]}" 3

2 个答案:

答案 0 :(得分:4)

您不能将数组传递给bash中的函数。您只能传递字符串。

任何通过"${array[@]}"传递的数组都将扩展为多个参数(类似于某些语言中的“ splat”运算符)。这个:

getParam "${array[@]}" 3

因此等同于此:

getParam "one" "two" "three" 3

解释为什么$2two

相反,您可以:

答案 1 :(得分:0)

可以在此处执行的操作是使用一些棘手的参数扩展:

getparams() {
    local ary=( "${@:1:$#-1}" )
    local last=${!#}
    declare -p ary last
}

getparams "a b" "c d" 10
declare -a ary='([0]="a b" [1]="c d")'
declare -- last="10"

ary正在获取位置参数的一部分,从索引1开始,并获取($#-1)=(3-1)= 2个元素。
last是变量间接寻址:$#这里是3,所以${!#}等效于$3

参考:Shell Parameter Expansion