2010-12-27 16 views
1

Kann mir jemand helfen, den richtigen Wert aus einer Bash-Skript-Funktion zurückzugeben?Bash-Skript-Funktion Rückgabewert Problem

Hier ist meine Funktion, die erste (und einzige) Zeile der Datei als Argument übergeben zurückkehren sollte:

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

Und mein Aufruf dieser Funktion in dem anderen Skript:

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

Ich bekomme immer einige zufällige Werte mit diesem Code. Wenn zum Beispiel ein Wert von 62772031 in der "Log-Datei" es gibt, erhalte ich

Timestamp = 255

als Ausgang. Für einige andere Werte in der Datei erhalte ich andere zufällige Werte als Rückgabewert, niemals den richtigen Wert.

Irgendwelche Ideen?

Antwort

5

Der Exit-Code ist auf 0 - 255, Sie es nicht für einen Zeitstempel verwenden können .

Echo stattdessen Ihren Zeitstempel, da Sie nichts anderes auszugeben scheinen; Das sollte in Ordnung sein?

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" 

Sie könnten die Funktion in Ihrem Beispiel vereinfacht, denn wenn alles, was Sie die erste Zeile wollte, war, warum nicht head -1 logfile stattdessen verwenden?

+0

Weißt du, wie könnte ich das in sh, statt bash. In sh timestamp = $ (LOG_FILE_CREATION_TIME "Protokolldatei") funktioniert nicht. Es heißt 'timestamp = $' unerwartet – Eedoh

+0

@Eedoh versuchen, Backticks, 'timestamp = \' ... \ '' – plundra

7

Shell-Funktionen funktionieren wie Befehle. Sie können nur Fehlerwertwerte (Ganzzahlen) zurückgeben. Um Zeichenketten zu erhalten, können Sie entweder eine globale Variable setzen oder den Wert drucken/abfragen und den Aufrufer dann die Befehlssubstitution verwenden lassen (wie Back-Ticks).

Dies funktioniert:

#!/bin/bash 

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

timestamp=$(LOG_FILE_CREATION_TIME $1) 

echo $timestamp 

Unrelated, aber BTW in Python:

#!/usr/bin/python2 

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

;-)

+0

Wirklich, Python ausführen 'Kopf -1'? Es wird viele Antworten geben, wenn wir es in allen Sprachen implementieren ... – plundra

+0

@plundra Ich gehe davon aus, dass es mehr zu diesem Programm geben wird. Sicher, Kopf -1 funktioniert am besten für eine einmalige Sache. Ich habe angedeutet, dass das OP einen anderen Weg gehen könnte, als ein großes Programm mit Funktionen in der Shell zu schreiben. – Keith

0

Eine andere Möglichkeit ist die Verwendung einer globalen Variablen. Sie können auf diese Weise mehrere "Return" -Variablen haben. Es gibt eigentlich nichts zurück, aber es funktioniert.

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

Ausgabe

starting 
0 
String1 String2 String3 and many other strings