2014-05-19 29 views
5

Ich muss die Anzahl der Zeilen einer bestimmten Variable zählen. Zum Beispiel muss ich herausfinden, wie viele Zeilen VAR hat, wo VAR=$(git log -n 10 --format="%s").Anzahl der Zeilen richtig zählen eine Bash-Variable

Ich versuchte mit echo "$VAR" | wc -l), die in der Tat funktioniert, aber wenn VAR leer ist, ist Drucke 1, was falsch ist. Gibt es einen Workaround dafür? Etwas besser als mit einer if -Klausel zu überprüfen, ob die Variable leer ist ... (vielleicht eine Zeile hinzufügen und 1 von dem zurückgegebenen Wert subtrahieren?).

+0

Sie möchten alle leeren Zeilen ausschließen oder nur wenn es eine einzige leere Zeile gibt? – Kent

+0

'git log' erzeugt entweder nichts, einige Zeilen. Also muss ich den Fall einer leeren Variablen behandeln, da es keine leeren Zeilen geben wird, wenn die Variable nicht leer ist. – linkyndy

+0

Es ist nicht wahr! 'git log -n 10' erzeugt leere Zeilen. aber ich bekomme was du willst. – Kent

Antwort

12

Die wc zählt die Anzahl der Zeilenvorschubzeichen. Sie können grep -c '^' zum Zählen von Zeilen verwenden. Sie können den Unterschied mit sehen:

#!/bin/bash 

count_it() { 
    echo "Variablie contains $2: ==>$1<==" 
    echo -n 'grep:'; echo -n "$1" | grep -c '^' 
    echo -n 'wc :'; echo -n "$1" | wc -l 
    echo 
} 

VAR='' 
count_it "$VAR" "empty variable" 

VAR='one line' 
count_it "$VAR" "one line without \n at the end" 

VAR='line1 
' 
count_it "$VAR" "one line with \n at the end" 

VAR='line1 
line2' 
count_it "$VAR" "two lines without \n at the end" 

VAR='line1 
line2 
' 
count_it "$VAR" "two lines with \n at the end" 

was produziert:

Variablie contains empty variable: ==><== 
grep:0 
wc :  0 

Variablie contains one line without \n at the end: ==>one line<== 
grep:1 
wc :  0 

Variablie contains one line with \n at the end: ==>line1 
<== 
grep:1 
wc :  1 

Variablie contains two lines without \n at the end: ==>line1 
line2<== 
grep:2 
wc :  1 

Variablie contains two lines with \n at the end: ==>line1 
line2 
<== 
grep:2 
wc :  2 
+1

Großer Vorschlag mit 'grep -c '^'' dafür. – linkyndy

5

Sie können es immer schreiben bedingt:

[ -n "$VAR" ] && echo "$VAR" | wc -l || echo 0 

Dies wird prüfen, ob $VAR Inhalt hat und entsprechend handeln.

+0

Es war ein bisschen lang, deshalb dachte man, es gäbe einen besseren Weg. – linkyndy

+0

Sobald es so skurril wird, würde ich wahrscheinlich den sicheren Weg nehmen und es explizit schreiben. – nemo

1

Versuch:

echo "$VAR" | grep^| wc -l 
+2

:) oder einfacher: 'grep -c '^'' - siehe meine Antwort ..;) – jm666

+0

ok, sehr gute Antwort –

5

Für eine reine bash Lösung: statt der Ausgabe des git Befehl Indienststellung eine Variable (die wohl hässlich ist), setze sie in ein Array, eine Zeile pro Feld:

mapfile -t ary < <(git log -n 10 --format="%s") 

Dann brauchen Sie nur die Anzahl der Felder in der Matrix zählen ary:

echo "${#ary[@]}" 

Dieses Design wird auch Ihr Leben einfacher machen, wenn Sie zB die 5. abrufen müssen Commit-Nachricht:

echo "${ary[4]}" 
+2

+1 das ist die beste Antwort von allen. – anubhava

+1

+1 mein Lieblings-Benutzername auf SO –