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

时间:2013-02-12 16:29:36

标签: 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=$(fntmpfile "$mainname")
echo "main retval=$retval"

实际发生的事情恰恰相反。第一个echo返回到调用函数,第二个echo返回STDOUT。为什么会这样,有更好的方法......

  

main retval =这是我的临时档案老兄!   /tmp/main.19121

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

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

这样做的全部问题是返回字符串值的函数正在获取log_to_console输出,这取决于事物的顺序。我想这是关于shell脚本的一些我不知道的事情。

1 个答案:

答案 0 :(得分:0)

不,发生了什么事情,你正在运行你的功能,它输出两行到stdout:

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

当你运行它$()时,bash将拦截输出并将其存储在值中。存储在变量中的字符串包含第一个换行符(最后一个换行符被删除)。那么“retval”变量的真正含义是以下C风格的字符串:

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

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