Bash:导出未将变量正确传递给父级

Posted

技术标签:

【中文标题】Bash:导出未将变量正确传递给父级【英文标题】:Bash: export not passing variables correctly to parent 【发布时间】:2014-11-05 06:43:35 【问题描述】:

子脚本中导出的变量在父脚本中未定义(a.sh):

#!/bin/bash
# This is the parent script: a.sh
export var="5e-9"
./b.sh var
export result=$res;  # $res is defined and recognized in b.sh
echo "result = $result"

子脚本 (b.sh) 如下所示:

#!/bin/bash
# This is the child script: b.sh
# This script has to convert exponential notation to SI-notation
var1=$1
value=$!1
exp=$value#*e
reduced_val=$value%[eE]*
if [ $exp -ge -3 ] || [ $exp -lt 0 ]; then SI="m";
elif [ $exp -ge -6 ] || [ $exp -lt -3 ]; then SI="u";
elif[ $exp -ge -9 ] || [ $exp -lt -6 ]; then SI="n";
fi

export res=$reduced_val$SI
echo res = $res

如果我现在使用./a.sh 运行父级,输出将是:

res = 5n
result = 4n

所以这里有一些舍入问题。有人知道为什么以及如何解决它吗?

【问题讨论】:

我猜你想做./b.sh $var,否则你将字符串“var”提供给b.sh而不是变量$var 这不是export 应该做的。它将变量传递给子级,无法在父级中设置变量。 【参考方案1】:

Michael Jaros 的解决方案是 IMO 的一种更好的方法。您可以扩展它以使用 read 将任意数量的变量传回父级:

b.sh

#!/bin/bash
var1="var1 stuff"
var2="var2 stuff"
echo "$var1;$var2"

a.sh

 IFS=";" read -r var1 var2 < <(./b.sh );
 echo "var1=$var1"
 echo "var2=$var2"

【讨论】:

我同意这是更好的解决方案。如果子脚本的输出包含导出变量以外的其他内容,则可以为导出变量的行使用关键字(例如EXPORT_VARIABLE var value),以便相应地过滤输出。【参考方案2】:

在 bash 中导出变量会将它们包含在任何子 shell(子 shell)的环境中。但是无法访问父 shell 的环境。

就您的问题而言,我建议仅将$res 写入b.sh 中的stdout,并通过a.sh 中的子shell 捕获输出,即result=$( b.sh )。与使用共享变量相比,这种方法更接近结构化编程(您调用一段返回值的代码),并且更易读且不易出错。

【讨论】:

只要我使用result=$(./b.sh var),它就可以很好地工作。然而在这种情况下,必须确定结果是唯一的输出。然而,在我的完整代码中可能有多个输出,在这种情况下,@blackSmith 的答案更合适且更一致。【参考方案3】:

要访问b.sh 中的变量,请改用source

source b.sh var

它应该给你想要的。

【讨论】:

这和使用. ./b.sh var一样吗? . b.sh 是适当的。 ./ 只是指向当前目录。 我似乎确实遇到了问题。我只希望将导出的变量传递回父级。子脚本中定义的其他变量不应影响父变量。这也可能吗? 我想这是不可能的。一个简单的解决方法是重命名子脚本中的冲突变量。 谢谢,我在模式中添加了一个特定模式到我只在子脚本中使用的变量中

以上是关于Bash:导出未将变量正确传递给父级的主要内容,如果未能解决你的问题,请参考以下文章

将数据从组件传递给父级

将数据从模态 segue 传递给父级

将值从灯箱传递给父级

如何将组件的状态传递给父级?

如何为不是直接父级而是父级父级的嵌套元素设置百分比宽度?

将属性从模态视图控制器传递给父级