Проблема возврата значения функции скрипта Bash - PullRequest
1 голос
/ 27 декабря 2010

Может кто-нибудь помочь мне вернуть правильное значение из функции скрипта bash?

Вот моя функция, которая должна возвращать первую (и единственную) строку файла, переданного в качестве аргумента:

LOG_FILE_CREATION_TIME()
{
    return_value=`awk 'NR==1' $1`
    return return_value
}

А вот мой вызов этой функции в другом скрипте:

LOG_FILE_CREATION_TIME "logfile"
timestamp=$?
echo "Timestamp = $timestamp"

Я всегда получаю некоторые случайные значения с этим кодом. Например, если в лог-файле есть значение 62772031, я получу

Метка времени = 255

в качестве вывода. Для некоторых других значений в файле я получаю другие случайные значения в качестве возвращаемого значения, но не правильное.

Есть идеи?

Ответы [ 3 ]

7 голосов
/ 27 декабря 2010

Функции оболочки работают как команды. Они могут возвращать только значения уровня ошибки (целые числа). Чтобы получить строки, вы можете либо установить глобальную переменную, либо распечатать / повторить значение, а затем заставить вызывающего использовать подстановку команды (например, обратные галочки).

Это работает:

#!/bin/bash

LOG_FILE_CREATION_TIME()
{
    return_value=`awk 'NR==1' $1`
    echo $return_value
}

timestamp=$(LOG_FILE_CREATION_TIME $1)

echo $timestamp

Не связано, но, кстати, в Python:

#!/usr/bin/python2

import sys
print open(sys.argv[1]).readline()

; -)

5 голосов
/ 27 декабря 2010

Код выхода ограничен 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 вместо этого?

0 голосов
/ 16 ноября 2012

Другой способ - использовать глобальную переменную.Таким образом, вы можете иметь несколько «возвращаемых» переменных.Он на самом деле ничего не возвращает, но делает трюк.

#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...