在一个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脚本的一些我不知道的事情。
答案 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脚本中执行),它只是捕获函数返回的任何输出。这就是为什么它不起作用。如果要登录控制台,请正常调用您的函数。