0

自分の関数にもパイプを入れているときに、bash の nameref を正しく動作させるのに問題があります。

以下の関数は、json blob を受け取り、それを bash 連想配列に変換します。bash は連想配列を値で渡すことができないため、戻り値の名前を受け取る関数を作成しました。すでにdeclare連想配列になっています。次に、nameref を設定して書き込みます。

この最初の例は動作します:

jq_to_aa () {
  # takes a json hash as $2, and the name of a var in $1. Adds all entries from $2 into $1, via jq.

  local -n j2a_result=$1
  input="${@:2}"
  input=$(echo "$input" | jq -rM ". | to_entries | .[] | @text \"\(.key) \(.value)\"")

  while read -r key val; do
    j2a_result["$key"]="$val"
  done < <(echo "${input}")
}

data='{"a": 0.96}'
declare -A assoc=( )
jq_to_aa assoc "${data}"
echo expect 0.96: ${assoc[@]}

$ bash script1.sh expect 0.96: 0.96

OK、ここまでは順調です。しかし、パイプ経由でデータを受け取る関数が欲しいです。明らかな変更点はecho "${data}" | jq_to_aa myvar、以下の関数を使用してそれを呼び出すことです。

jq_to_aa () {
  # takes a json hash in stdin, and the name of an var in $1. Adds all entries from stdin into $1.

  input=$(jq -rM ". | to_entries | .[] | @text \"\(.key) \(.value)\"")

  local -n j2a_result=$1
  while read -r key val; do
    j2a_result["$key"]="$val"
  done < <(echo "${input}")
}

data='{"a": 0.96}'
declare -A assoc=( )
echo "${data}" | jq_to_aa assoc
echo expect 0.96: ${assoc[@]}

$ bash script2.sh expect 0.96:

これは機能していないようで、その理由を理解するのに苦労しています。私の疑いでは、値をパイプすると問題が発生する可能性があります。おそらく、サブシェルが作成され(わかりません)、値が分離されるためです。

なぜこれが機能しないのですか?どうすれば解決できますか?

4

1 に答える 1

1

パイプラインを使用すると、関数がサブシェルで実行されます。サブシェルでの変数の割り当ては、親シェルには影響しません。代わりにヒア文字列を使用してください。

jq_to_aa assoc <<<"$data"
于 2015-09-02T21:21:22.793 に答える