修改数组函数参数Bash

时间:2015-01-29 19:54:59

标签: arrays bash parameters jq

我正在尝试修改我作为参数传递给函数的数组。到目前为止,我在函数外面有一个空数组:

buckets=()

然后我有一个接受2个参数的函数。第一个参数是我要填充的空数组。第二个参数是包含我想用来填充数组的数据的文件名。

到目前为止,我所做的是创建一个临时数组。然后用文件的内容填充临时数组。这就是我这样做的方式:

fillarray ()
{
# Declare the paramater as a temporary array
declare -a tempArray=("${!1}")

# Fill it up
while IFS= read -r entry; do
  tempArray+=("$entry")
done < <(jq -r '.data | .[].name' $2)

最后一步是将参数数组(aka buckets)设置为我们刚刚填充的临时数组的内容。关于如何做到这一点的任何建议?

2 个答案:

答案 0 :(得分:5)

BASH 4.3 + 中,您只需通过命名引用传递数组即可。所以你的功能可以简化为:

fillarray() {
   # tempArray is a reference to array name in $1
   local -n tempArray="$1"
   while IFS= read -r entry; do
      tempArray+=("$entry")
   done < <(jq -r '.data | .[].name' "$2")
}

然后将其称为:

buckets=()
fillarray buckets file.json

并将其测试为:

declare -p buckets

编辑:要使其在 BASH 3.2 上运行,请使用以下代码段:

fillarray() {
   # $2 is current length of the array
   i=$2
   while IFS= read -r entry; do
      read ${1}"[$i]" <<< "$entry"
      ((i++))
   done < <(jq -r '.data | .[].name' "$3")
}

然后将其称为:

buckets=()
fillarray buckets ${#buckets[@]} file.json

答案 1 :(得分:0)

通过eval

的另一种方式
fillarray () {
 local tempArray;

 while IFS= read -r entry; do
    tempArray[${#tempArray[@]}]="$entry";
 done < <(jq -r '.data | .[].name' $2);

 eval $1=\('"${tempArray[@]}"'\);
}