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

问题描述 投票:2回答:3

在子脚本中导出的变量未定义为父脚本(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

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

bash variables parameter-passing
3个回答
4
投票

要在qazxsw poi中访问变量,请使用qazxsw poi:

b.sh

它应该给你想要的东西。


1
投票

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

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


0
投票

迈克尔·雅罗斯的解决方案是一种更好的方法IMO。您可以展开它以使用read将任意数量的变量传递回父级:

不.是

a.sh

啊.是

result=$( b.sh )
© www.soinside.com 2019 - 2024. All rights reserved.