正如我们所知,在bash编程中传递参数的方式是$1
,...,$N
。然而,我发现将数组作为参数传递给一个接收多个参数的函数并不容易。下面是一个例子:
f(){
x=($1)
y=$2
for i in "${x[@]}"
do
echo $i
done
....
}
a=("jfaldsj jflajds" "LAST")
b=NOEFLDJF
f "${a[@]}" $b
f "${a[*]}" $b
如上所述,函数f
接收两个参数:第一个被分配给x
,它是一个数组,第二个被分配给y
。f
有两种调用方式。第一种方式使用"${a[@]}"
作为第一个参数,结果为:
jfaldsj
jflajds
第二种方式使用"${a[*]}"
作为第一个参数,结果为:
jfaldsj
jflajds
LAST
这两个结果都不是我所希望的。那么,有没有人知道如何在函数之间正确传递数组?
8条答案
按热度按时间nqwrtyyt1#
不能传递数组,只能传递其元素(即扩展数组)。
另一种可能是按名称传递数组:
xqnpmsa82#
通过设置
-n
属性,可以按名称引用将数组传递给bash中的函数(从版本4.3开始):这适用于索引数组:
它也适用于关联数组:
另请参阅缐上手册中的
nameref
或declare -n
。dhxwm5r43#
您可以先传递“标量”值,这样会简化事情:
此时,您还可以直接使用数组式的位置参数
izj3ouym4#
这将解决将数组传递给函数的问题:
o8x7eapl5#
这样试试
uyhoqukh6#
将数组作为函数传递
4szc88ey7#
下面是一个例子,我在函数中接收了2个bash数组,以及它们后面的附加参数。这种模式可以无限地继续 * 任意数量的bash数组 * 和 * 任意数量的附加参数 *,适应 * 任意输入参数顺序 *,只要每个bash数组的长度正好在该数组元素之前。
print_two_arrays_plus_extra_args
的函数定义:示例用法:
输出示例:
更多的例子和详细的解释,这是如何工作,请参阅我对这个主题的较长的答案在这里:Passing arrays as parameters in bash
9nvpjoqh8#
您还可以创建一个包含数组的json文件,然后使用jq解析该json文件
例如:
my-array.json:
script.sh:
然后调用脚本像: