任何人都可以帮我从bash脚本函数返回正确的值吗?
这是我的函数,它应该返回作为参数传递的文件的第一行(也是唯一的):
LOG_FILE_CREATION_TIME()
{
return_value=`awk 'NR==1' $1`
return return_value
}
这是我在另一个脚本中对该函数的调用:
LOG_FILE_CREATION_TIME "logfile"
timestamp=$?
echo "Timestamp = $timestamp"
我总是使用此代码获得一些随机值。例如,如果“logfile”中的值为62772031,则为
时间戳= 255
作为输出。对于文件中的其他一些值,我将其他随机值作为返回值,而不是正确的值。
有什么想法吗?
答案 0 :(得分:7)
Shell函数就像命令一样工作。它们只能返回错误级别值(整数)。要获取字符串,您可以设置全局变量,或者打印/回显该值,然后让调用者使用命令替换(如反向标记)。
这有效:
#!/bin/bash
LOG_FILE_CREATION_TIME()
{
return_value=`awk 'NR==1' $1`
echo $return_value
}
timestamp=$(LOG_FILE_CREATION_TIME $1)
echo $timestamp
无关,但在Python中是BTW:
#!/usr/bin/python2
import sys
print open(sys.argv[1]).readline()
- )
答案 1 :(得分:5)
退出代码仅限于0 - 255
,您无法将其用于时间戳。
改为回复您的时间戳,因为您似乎没有输出任何其他内容;这应该没问题?
LOG_FILE_CREATION_TIME()
{
# If you want to do some more stuff, you might want
# to use the intermediate variable as you first did.
awk 'NR==1' $1
}
timestamp=$(LOG_FILE_CREATION_TIME "logfile")
echo "Timestamp = $timestamp"
您可能已经简化了示例中的功能,因为如果您想要的只是第一行,为什么不使用head -1 logfile
?
答案 2 :(得分:0)
另一种方法是使用全局变量。您可以通过这种方式获得多个“返回”变量。 它实际上并没有返回任何东西,而是诀窍。
#!/bin/sh
concat_ret
concat() {
for s in $*
do
concat_ret="$concat_ret $s"
done
return 0
}
echo "starting"
concat String1 String2 String3 "and many other strings"
echo $?
echo $concat_ret
exit 0
输出
starting
0
String1 String2 String3 and many other strings