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