覆盖两个bash脚本中的变量

时间:2012-07-24 12:13:46

标签: linux bash

我必须打击脚本:

script1.sh

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

script2.sh

echo $HELLO
HELLO=world
export $HELLO

输出为hello hello而非hello world。如何在相互调用的脚本之间修改变量?

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

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

出于这个原因,script1.sh中提供了由script2.sh设置的变量,但在script2.sh中将其设置为script1.shscript2.sh }返回。

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

script1.sh:

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

script2.sh:

echo $HELLO >&2
HELLO=world
echo $HELLO

答案 2 :(得分:1)

当你通过./script2.sh调用新脚本时,它会分支新的shell,并且当script2完成执行时将关闭新的shell。当控件返回脚本时,它仍然是旧的shell,因此在script2中导出的变量将不可用。要在同一个shell中运行script2,你可以像“./script2.sh”

那样运行它
HELLO=hello
export HELLO
. ./script2.sh
echo $HELLO

答案 3 :(得分:0)

script1.sh的环境包含HELLO=hello。您在孩子script2.sh中所做的任何事情都不会改变这一点。