我有以下代码
for name in a b c d; do
for i in {01..12}; do
eval test_${name}_{i}=`some command`
done
done
我正在尝试在后台执行分配,但它在 shell 脚本中不起作用,如下所示:
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
我得到了空值
答案1
你无法获得这样的值。后台进程必须在另一个进程中运行,否则它不能独立于主shell。因此,它无法将值“存储”回主 shell。
相反,您可以将输出存储到一个文件(或多个文件)。
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
如果您希望它们出现在 shell 变量中,您可以从文件中读回它们。这里,在 Bash 中使用关联数组:
declare -A outputs
while IFS== read -r key value; do
outputs["$key"]="$value"
done < output
echo ${outputs[test_b_7]}
答案2
后台命令在子 shell 中运行。子 shell 命令不会影响父 shell 的环境(或内部变量)。