Bash Shell脚本返回值不正确,为什么?
在我编写的一个shell脚本中,为了测试函数如何返回值,我遇到了一个奇怪的意外行为。下面的代码假设在输入函数fnttmpfile时,第一条echo语句将打印到控制台,然后第二条echo语句将实际将字符串返回到调用main。我也这么想,但我错了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
#!/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。