Bash - 从子脚本返回值到父脚本

61

我有两个Bash脚本。父脚本调用子脚本执行某些操作并返回一个值。如何从子脚本向父脚本返回一个值?在子脚本中添加return并在父脚本中捕获该值并不起作用。


1
看看昨天的这个答案:https://dev59.com/1XHYa4cB1Zd3GeqPNqBW#16325765 - 它可能会有很大帮助。 - fedorqui
3个回答

84

我假设这些脚本在两个不同的进程中运行,即你没有“源”其中之一。

这取决于你想要返回什么。如果你只想返回一个介于0和255之间的退出代码,则:

# Child (for example: 'child_script')
exit 42

# Parent
child_script
retn_code=$?

如果您想返回一个文本字符串,那么您必须通过stdout(或文件)来实现。有几种捕获方式,最简单的方法是:
# Child (for example: 'child_script')
echo "some text value"

# Parent
retn_value=$(child_script)

6
echo方法是否返回子脚本输出的所有内容,还是仅返回最后一行? - A F
3
在这种情况下,echo命令会输出给它的内容:"some text value"。然而,父进程会捕获子进程的所有标准输出,无论是来自echo还是其他命令,可能会有多行输出,用换行符$'\n'分隔。 - cdarke
1
@cdarke 如果我只想让父级捕获最后一行呢? - Saltuk Kezer
@SaltukKezer 你可以使用 tail -1 命令获取最后一行。 - user3091996

5

以下是另一种使用临时文件从子脚本返回文本值的方法。在父脚本中创建一个临时文件并将其传递给子脚本。我喜欢这种方法而不是解析脚本输出。

父脚本

#!/bin/bash
# parent_script
text_from_child_script=`/bin/mktemp`
child_script -l $text_from_child_script
value_from_child=`cat $text_from_child_script`
echo "Child value returned \"$value_from_child\""
rm -f $text_from_child_script
exit 0

子元素

#!/bin/bash
# child_script
# process -l parm for tmp file

while getopts "l:" OPT
do
    case $OPT in
      l) answer_file="${OPTARG}"
         ;;
    esac
done

read -p "What is your name? " name

echo $name > $answer_file

exit 0

-3

从下标返回一个值并检查变量$?,该变量包含返回值


5
这里的“Return”不够清晰,因为“return”语句只能用于从函数返回,而不是脚本。 要精确表达,您需要使用“exit”语句来从脚本中退出。 - chepner
2
@chepner:实际上,return 也可以从“sourced”文件(.source命令)中使用,但那是否是一个脚本呢? - cdarke
啊,有点棘手。我猜正确的答案是“根据情况使用returnexit”。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接