次のコードがあります
for name in a b c d; do
for i in {01..12}; do
eval test_${name}_{i}=`some command`
done
done
バックグラウンドで割り当てを実行しようとしていますが、次のシェルスクリプトでは機能しません。
for name in a b c d; do
for i in {01..12}; do
eval test_${name}_{i}=`some command` &
done
done
wait
echo $test_a_01
私はnull値を得ました
答え1
そのような値を得ることはできません。バックグラウンドプロセスは他のプロセス内で実行する必要があります。それ以外の場合は、デフォルトのシェルから独立することはできません。したがって、値をデフォルトのシェルに「保存」することはできません。
代わりに、出力をファイル(または複数のファイル)に保存できます。
for name in a b c d; do
for i in {1..12}; do
printf "test_${name}_${i}=%s\n" "$(some command "$name" "$i")" >> output &
done
done
wait
シェル変数に表示されるようにするには、ファイルから読み直すことができます。ここでは、Bashで連想配列を使用します。
declare -A outputs
while IFS== read -r key value; do
outputs["$key"]="$value"
done < output
echo ${outputs[test_b_7]}
答え2
バックグラウンドコマンドはサブシェルで実行されます。サブシェルコマンドは、親シェルの環境(または内部変数)には影響しません。