2017-02-22 1 views
1

Ich weiß nicht, warum ich ein extra 0 bekomme, wenn ich mein Skript ausführen.Warum bekomme ich eine extra 0 auf meinem Skript

Dies ist mein Skript: Ich führe eine SQL-Abfrage und speichern Sie es in eine Datei valor.txt.

Das ist mein Array: array=(50 60 70)

Valor.txt:

count | trn_hst_id | trn_msg_host 
-------+------------+-------------- 
    11 |   50 | Aprobada 
    2 |   70 | Aprobada 
(2 rows) 

Code:

function service_status { 
    cd 
    cat valor.txt | grep $1 | gawk '{print $1}' FS="|" | sed "s/ //g" 
    if [ $? -eq 0 ]; then 
     echo -n 0 
     else 
     echo -n $1 
    fi 
} 

     echo "<prtg>" 

# <-- Start 
     for i in "${array[@]}" 
     do 

     echo -n " <result> 
     <channel>$i</channel> 
     <value>" 
     service_status $i 
     echo "</value> 
     </result>" 
     done 
# End --> 
     echo "</prtg>" 
     exit 

Und das ist meine Ausgabe.

<prtg> 
    <result> 
     <channel>50</channel> 
     <value>11 
0</value> 
     </result> 
    <result> 
     <channel>60</channel> 
     <value>0</value> 
     </result> 
    <result> 
     <channel>70</channel> 
     <value>2 
0</value> 
     </result> 
</prtg> 

Warum erhalte ich die 0 hier? —

 <value>2 
0</value> 
+0

Was sind die Werte in 'array' "Was ist in' valor.txt'? Vermutlich produziert Ihre Pipeline einen Wert, dann machen Sie 'echo -n 0'. –

+0

Ich denke, es ist die Ausgabe von' cat valor.txt | grep $ 1 | gawk '{ Druck $ 1} 'FS = "|" | sed "s/// g" '. Nicht sicher, warum Sie diese Befehlssequenz haben und dann auch 'echo' Anweisungen basierend auf' $? 'Haben. – codeforester

+0

@TomFenech sorry, jetzt ist es oben –

Antwort

1

Wenn ich Ihren Kommentar richtig verstehe, wollen Sie die Zählung drucken. Das ist der Wert der count Spalte, falls vorhanden in valor.txt, oder 0, wenn die trn_hst_id in array nicht in valor.txt ist. Dies sollte funktionieren (wenn auch nicht getestet):

function service_status { 
    val=$(cat ~/valor.txt | grep $1 | gawk '{print $1}' FS="|" | sed "s/ //g") 
     #  ^^ so you don't need to "cd" each time 
     # Save the value into "$val" 
    echo -n "${val:-0}"  # If there is nothing in $val, print a 0 
} 

Die "${val:-0}" Sequenz erweitert als "$val", wenn $val Text in ihm hat, oder als wörtliche 0 anders. Wenn die $1 nicht in valor.txt war, ist $val leer, so dass Sie eine Null erhalten. Siehe the wiki für mehr darüber, wie und Freunde arbeiten.

1

Die „0“ ist, das Ergebnis der echo -n 0, die innerhalb der Funktion im Fall ausgeführt wird, der awk Befehl richtig arbeitet (was normalerweise der Fall ist). Aus dem Code ist nicht klar, warum es so geschrieben ist wie es ist. Es ist klar, dass bestimmte Werte aus einer Datei extrahiert werden sollen, aber die 'if'-Bedingung scheint das falsche Ding zu überprüfen, der Rückkehrcode von' sed ', auf den ich wette, ist nicht das, was beabsichtigt ist. (Besserer Kandidat wäre der Return-Code von ‚grep‘ sein

So würde ich die Funktion wie folgt schreiben:..

function service_status { 
    cd 
    var=$(cat valor.txt | grep $1 | gawk '{print $1}' FS="|" | sed "s/ //g") 
    if [ -z "$var" ]; then 
     echo -n 0 
    else 
     echo -n "$var" 
    fi 
} 

Die Variable ‚var‘ wird das Ergebnis der „Suchbefehl“ enthalten Wenn die Suche würde keinen Wert zurückliefern, dann wäre 'var' leer und '0' wird die Ausgabe der Funktion sein, sonst wird der Inhalt von 'var' am Ausgang sein.

Verwandte Themen