Bash Shell脚本返回值不正确,为什么?

Bash Shell脚本返回值不正确,为什么?,bash,shell,scripting,Bash,Shell,Scripting,在我编写的一个shell脚本中,为了测试函数如何返回值,我遇到了一个奇怪的意外行为。下面的代码假设在输入函数fnttmpfile时,第一条echo语句将打印到控制台,然后第二条echo语句将实际将字符串返回到调用main。我也这么想,但我错了 #!/bin/sh fntmpfile() { TMPFILE=/tmp/$1.$$ echo "This is my temp file dude!" echo "$TMPFILE" } mainname=main retval=$(fntmpfil

在我编写的一个shell脚本中,为了测试函数如何返回值,我遇到了一个奇怪的意外行为。下面的代码假设在输入函数fnttmpfile时,第一条echo语句将打印到控制台,然后第二条echo语句将实际将字符串返回到调用main。我也这么想,但我错了

#!/bin/sh

fntmpfile() {
TMPFILE=/tmp/$1.$$
echo "This is my temp file dude!"
echo "$TMPFILE"
}

mainname=main
retval=$(fntmpfile "$mainname")
echo "main retval=$retval"
事实恰恰相反。第一个回显到调用函数,第二个回显到STDOUT。为什么会这样,有没有更好的方法

main retval=这是我的临时文件,伙计! /tmp/main.19121

这个测试的全部原因是因为我正在编写一个shell脚本来做一些数据库备份,并决定使用一些小函数来做一些特定的事情,你知道,让它变得干净,而不是像意大利面条一样的代码。我使用的功能之一是:

log_to_console() {
    # arg1 = calling function name
    # arg2 = message to log
    printf "$1 - $2\n"
}

整个问题在于,返回字符串值的函数根据事情的顺序获取log_to_控制台输出。我想这是我不知道的关于shell脚本的一些问题之一。

不,发生的事情是您正在运行您的函数,它向stdout输出两行代码:

This is my temp file dude!
/tmp/main.4059
当您运行它时,
$()
,bash将截取输出并将其存储在值中。存储在变量中的字符串包含第一个换行符(删除最后一个换行符)。因此,“retval”变量中真正包含的是以下C样式字符串:

"This is my temp file dude!\n/tmp/main.4059"

这并不是真正返回字符串(在shell脚本中不能这样做),它只是捕获函数返回的任何输出。这就是它不起作用的原因。如果要登录到控制台,请正常调用您的函数。

您的实际问题是什么?可能存在重复。Shell函数返回0-255之间的值,它们不能返回字符串。也可以将日志输出发送到stderr(即
echo“Created temp file:$TMPFILE”>&2
)-
$()
仅捕获stdout。