2010-12-27 5 views
1

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

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

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

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

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

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

Timestamp = 255

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

Любые идеи?

ответ

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 вместо этого?

+0

Знаете ли вы, как я мог сделать это в sh, а не bash. В sh timestamp = $ (LOG_FILE_CREATION_TIME "logfile") не работает. Он говорит «timestamp = $» неожиданно – Eedoh

+0

@Eedoh попробуйте использовать обратные метки, 'timestamp = \' ... \ '' – plundra

7

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

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

#!/bin/bash 

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

timestamp=$(LOG_FILE_CREATION_TIME $1) 

echo $timestamp 

Unrelated, но BTW в Python:

#!/usr/bin/python2 

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

;-)

+0

Действительно, Python для выполнения 'голову -1'? Там будет * LOT * ответов, если мы должны были реализовать его на всех языках ... – plundra

+0

@plundra Я предполагаю, что в этой программе будет больше, чем это. Конечно, голова -1 работает лучше всего для одноразовой вещи. Я намекнул, что OP может пойти по другому пути, чем писать большую программу с функциями в оболочке. – Keith

0

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

#!/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