子脚本中导出的变量未定义为父脚本(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
所以这里有一些四舍五入的问题。任何人都知道为什么以及如何解决它?
答案 0 :(得分:4)
要在b.sh
中使用source
来访问变量,而不是:
source b.sh var
它应该给你想要的东西。
答案 1 :(得分:1)
在bash中导出变量将它们包含在任何子shell(子shell)的环境中。但是无法访问父shell的环境。
就您的问题而言,我建议仅将$res
写入b.sh
中的stdout,并通过a.sh
中的子shell捕获输出,即result=$( b.sh )
。与使用共享变量相比,这种方法更接近于结构化编程(您调用一段返回值的代码),并且它更易读,更不容易出错。
答案 2 :(得分:0)
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"