2013-02-12 204 views
0

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

#!/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_console输出,而不是取决于事物的数量级上。我想这是我没有意识到的有关shell脚本的一些棘手问题。

+2

你真正的问题是什么? – 2013-02-12 16:34:26

+0

可能的重复http://stackoverflow.com/questions/14482943/can-i-return-a-string-from-a-bash-function-without-echo-or-global-variables。 – 2013-02-12 16:38:01

+0

Shell函数返回0-255之间的值,它们不能返回字符串。 – cdarke 2013-02-12 18:55:11

回答

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脚本),它只是捕捉任何输出你的函数返回。这是为什么它不起作用。如果要登录到控制台,请正常调用您的功能。

+0

将日志记录输出发送到stderr(例如'echo“创建的临时文件:$ TMPFILE”>&2') - '$()'只能捕获stdout。 – 2013-02-12 17:19:21

相关问题