是否可以将数组直接传递给shell / bash中的函数,而不首先将其保存到变量?
目前的例子:
function checkParameter(){
param1=("${!1}")
for a in "${param1[@]}"; do
echo "${a}"
done
param2=("${!2}")
for b in "${param2[@]}"; do
echo "${b}"
done
}
a=( "child 1 from 1" "child 2 from 1" "child 3 from 1" )
b=( "child 1 from 2" "child 2 from 2")
checkParameter a[@] b[@]
我可以将( "child 1 from 1" "child 2 from 1" "child 3 from 1" )
和( "child 1 from 2" "child 2 from 2")
直接传递给函数checkParameter
,而不是先将其保存在a
和b
吗?
答案 0 :(得分:1)
" $ 1和#34;是不可改变的。这就是为什么您的示例必须将其值存储在临时变量中的原因。这适用于$@
,无论它们是否作为数组传递。
答案 1 :(得分:0)
您确定需要使用数组吗?
checkparameters() {
for param in "$@"; do
echo "$param"
done
}
checkparameters "a" "b" "c"
要回答这个问题,我不认为可以将数组作为函数的args传递而不进行转换。
修改强>
您可以尝试以下方式:
[ ~]$ cat test.sh
#!/bin/bash
declare -a a1
a1=("a" "b")
declare -a a2
a2=("c" "d")
checkParameters(){
for i in "$@"; do
echo "Content of $i :"
for j in $(eval "echo \${$(echo $i)[@]}"); do
echo $j
done
done
}
checkParameters "a1" "a2"
[ ~]$ ./test.sh
Content of a1 :
a
b
Content of a2 :
c
d
答案 2 :(得分:0)
通常,无法将数组传递给Bash脚本或函数作为数组:
当您在命令行上传递数组时,例如"${ary[@]}"
,您不会传递数组,而是将元素传递为< em>个人参数;第一个数组元素绑定到特殊参数$1
,第二个绑定到$2
,...
您的解决方案尝试将数组变量的名称传递给函数,其中变量间接({{1} })用于访问函数内的数组。 [1]
根据定义,这种方法要求数组预先存储在变量中。
至于你希望在不将数组存储在变量中的情况下执行此操作:您无法在Bash中将数组文字作为参数传递;概念等同于简单地传递个别参数。
问题在于您无法分辨出一个数组的元素结束和下一个数组的开始。
您可以通过引入 separator 参数来解决这个问题,该参数的唯一目的是指示数组何时结束。
例如,如果您知道您的元素永远不会包含换行符,可以使用${!...}
作为分隔符:
$\n
[1]只是为了展示解决方案的简化版本,使变量 - 间接部分更加清晰:
#!/usr/bin/env bash
function checkParameter(){
local -i arrayNdx=1
for param; do # Loop over all parameters
[[ $param == $'\n' ]] && { (( ++arrayNdx )); continue; }
echo "From array $arrayNdx: [$param]"
done
}
# Pass the array elements as individual parameters
# and use $'\n' (a newline) to separate the elements of the 1st
# array from those of the 2nd.
checkParameter "a1-child 1" "a1-child 2" "a1-child 3" $'\n' "a2-child 1" "a2-child 2"