1

我必须 bash 脚本:

脚本1.sh

HELLO=hello
export HELLO
./script2.sh
echo $HELLO

脚本2.sh

echo $HELLO
HELLO=world
export $HELLO

输出hello hello代替hello world. 如何修改相互调用的脚本之间的变量?

编辑:将变量作为参数传递是行不通的。我不知道 script2.sh 中可能更改的变量数量。

4

4 回答 4

3

如果您不想将第二个脚本作为子进程运行,则必须获取它:

HELLO=hello
export HELLO
. ./script2.sh  # Note the dot at the beginning
echo $HELLO

在第二个脚本中不需要导出 - 您已经告诉 bash 导出变量。

于 2012-07-24T12:22:53.933 回答
1

导出的变量在子 shell 中可用(与script2.shvs一样script1.sh),但在父 shell 中不可用。

出于这个原因,设置的变量在script1.sh中是可用的script2.sh,但是设置它script2.sh不会使它在返回script1.sh时可用。script2.sh

如果您要将变量传递回调用者,则需要echo它,并获取script2.sh. 但是,script2.sh如果您想查看其输出,则需要写入 stderr:

脚本1.sh:

HELLO=hello
export HELLO
HELLO=$(./script2.sh)
echo >&2 $HELLO

脚本2.sh:

echo $HELLO >&2
HELLO=world
echo $HELLO
于 2012-07-24T12:23:24.293 回答
1

当你通过 ./script2.sh 调用新脚本时,它会派生新的 shell,当 script2 完成执行时,新的 shell 将被关闭。当控制返回到脚本时,它仍然是旧的 shell,所以在 script2 中导出的变量将不可用。要在同一个 shell 中运行 script2,你可以像“. ./script2.sh”一样运行它

HELLO=hello
export HELLO
. ./script2.sh
echo $HELLO
于 2012-07-24T12:33:28.343 回答
0

script1.shcontains的环境HELLO=hello。你在孩子身上做的任何事情都script2.sh不会改变这一点。

于 2012-07-24T12:17:00.420 回答