Bash脚本函数返回值问题

时间:2010-12-27 10:43:40

标签: linux bash shell scripting return-value

任何人都可以帮我从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

作为输出。对于文件中的其他一些值,我将其他随机值作为返回值,而不是正确的值。

有什么想法吗?

3 个答案:

答案 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