eval变量=后台命令

eval变量=后台命令

我有以下代码

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 的环境(或内部变量)。

相关内容