3

関数にパラメーターとして渡した配列を変更しようとしています。これまでのところ、関数の外側に空の配列があります。

buckets=()

次に、2つの引数を取る関数があります。最初の引数は、埋めたい空の配列です。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)

最後のステップは、パラメーター配列 (別名バケット) を、先ほど入力した一時配列の内容に設定することです。これを行う方法について何か提案はありますか?

4

2 に答える 2

7

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
于 2015-01-29T20:17:08.723 に答える
0

経由の別の方法eval

fillarray () {
 local tempArray;

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

 eval $1=\('"${tempArray[@]}"'\);
}
于 2015-01-29T23:03:55.900 に答える