#!/bin/bash
grand()
{
i=$1
GRAND_TOTAL[$i]=$2
echo "inside function GRAND_TOTAL[$i]: ${GRAND_TOTAL[$i]}"
}
GRAND_TOTAL=(0 0 0 10 0)
GRAND_TOTAL[2]=23
echo ${GRAND_TOTAL[2]}
echo ${GRAND_TOTAL[3]}
grand 1 100 &
grand 2 200 &
wait
echo "outside function GRAND_TOTAL[1]: ${GRAND_TOTAL[1]}"
echo "outside function GRAND_TOTAL[2]: ${GRAND_TOTAL[2]}"
结果: 23 10 内部函数GRAND_TOTAL [1]:100 内部函数GRAND_TOTAL [2]:200 外部函数GRAND_TOTAL [1]:0 外部功能GRAND_TOTAL [2]:23
为什么不同线程中的函数不能更改全局数组?但如果按顺序运行它可以改变。
如果我调用该函数按顺序运行
grand 1 100
grand 2 200
结果:
23
10
inside function GRAND_TOTAL[1]: 100
inside function GRAND_TOTAL[2]: 200
outside function GRAND_TOTAL[1]: 100
outside function GRAND_TOTAL[2]: 200
答案 0 :(得分:1)
后台进程是使用fork()
创建的,因此它们拥有自己的所有进程内部内存副本,包括(在本例中)Bash变量。 (有关&
导致命令在子shell中运行的语句,请参阅 Bash参考手册,§3.2.3 "Lists of Commands";有关子shell的说明,请参阅§3.7.3 "Command Execution Environment"不能影响其父shell的执行环境。)唯一的解决方法是使用某种外部存储,例如命名管道或常规文件。