在shell脚本之间共享变量

时间:2014-11-13 06:53:27

标签: bash shell

我有一个shell脚本(让它称之为parent.sh),它调用另一个shell脚本(child.sh),并为其传递一个参数。

子脚本执行一些操作并在名为create_sql的变量中设置值。我想从调用它的父脚本访问此create_sql变量。

我在父脚本中调用子脚本,如下所示:

./child.sh "$dictionary"

然后我直言:

echo "The resulting create script is: "$create_sql

但是,没有输出值,但是,在子脚本中我正在做同样的事情并且变量肯定是设置的。

如何让它工作,以便我可以读取子脚本创建的变量?

2 个答案:

答案 0 :(得分:4)

简洁地说,您不能让子脚本在父脚本中设置变量,除非您执行以下操作:

. ./child.sh "$dictionary"

(或者在Bash中,模仿C shell,source ./child.sh "$dictionary")。这将在当前shell的环境中读取并执行脚本,但可能会更改parent.sh脚本中的任何其他变量;脚本之间没有隔离。否则,子进程无法合理地设置父shell的环境。 (如果你想疯狂地做,你可以让子shell运行一个调试器,附加到父shell进程并以这种方式设置环境 - 但称之为'疯狂'是礼貌的。)

可以说,从父脚本中的变量中获取子项输出的最佳方法是让child.sh$create_sql中回显您想要的值,然后使用

create_sql=$(./child.sh "$dictionary")
echo "The resulting create script is: $create_sql"

赋值运算符周围没有空格。请注意,echo包含双引号内的变量;这将保留变量值中的内部间距(包括换行符)。正如问题中所写,变量被扁平化为空格分隔的“单词”流(非空格序列),失去了任何内部空间。

答案 1 :(得分:0)

使用来源卢克! source word(或。)允许运行脚本,就像它在当前shell中一样。 要注意,你的剧本和来源已经结婚了#39; :-),sourced脚本可以完全访问所有变量,无论好坏......

其他方式意味着修改被调用的脚本以产生一种流格式,调用者将使用script params | read VARRESULT=$(SCRIPT params)读取并回显来自您调用脚本的结果