我必须打击脚本:
script1.sh
HELLO=hello
export HELLO
./script2.sh
echo $HELLO
script2.sh
echo $HELLO
HELLO=world
export $HELLO
输出为hello hello
而非hello world
。如何在相互调用的脚本之间修改变量?
编辑:将变量作为参数传递将不起作用。我不知道script2.sh中可能更改的变量数。
答案 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.sh
时script2.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
中所做的任何事情都不会改变这一点。