122 Stimmen

Wie kann ich in der Bash die Anzahl der Zeilen in einer Variablen zählen?

Ich habe eine Variable, in der eine Zeichenfolge gespeichert ist, und muss prüfen, ob sie Zeilen enthält:

var=`ls "$sdir" | grep "$input"`

Pseudocode:

while [ ! $var's number of lines -eq 1 ]
  do something

Das ist meine Idee, wie man das überprüfen kann. echo $var | wc -l funktioniert nicht - es heißt immer 1 auch wenn es eine 3 .

echo -e funktioniert nicht so gut.

9voto

Sie können "wc -l" durch "wc -w" ersetzen, um statt der Zeilen die Anzahl der Wörter zu zählen. Dadurch werden keine neuen Zeilen gezählt und Sie können testen, ob Ihre ursprünglichen Ergebnisse leer sind, bevor Sie fortfahren.

5voto

adrenochrome Punkte 41

Eine andere Methode, um die Anzahl der Zeilen in einer Variable zu zählen - vorausgesetzt, Sie haben geprüft, ob sie erfolgreich gefüllt wurde oder nicht leer ist, prüfen Sie einfach $? nach var Teilergebnis Beeinflussung - :

readarray -t tab <<<"${var}"
echo ${#tab[@]}

readarray|mapfile ist ein interner Bash-Befehl, der die Eingabedatei konvertiert, oder hier Zeichenkette in diesem Fall in ein Array auf der Grundlage von Zeilenumbrüchen.

-t verhindert das Speichern von Zeilenumbrüchen am Ende der Zellen eines Arrays, nützlich für die spätere Verwendung der gespeicherten Werte

Die Vorteile dieser Methode sind:

  • kein externer Befehl (wc, grep, ...)
  • keine Unterschale (Rohr)
  • keine IFS-Probleme (Wiederherstellung nach einer Änderung, schwierige Verwendung bei begrenztem Umfang der internen Befehle, ...)

4voto

user3503711 Punkte 1049

Um Dateinamen im Befehl "wc -l" zu vermeiden:

lines=$(< "$filename" wc -l)
echo "$lines"

3voto

Jonathan Matthews Punkte 115

Die am häufigsten gewählten Antworten schlagen fehl, wenn ein grep keine Ergebnisse liefert.

Homer Simpson
Marge Simpson
Bart Simpson
Lisa Simpson
Ned Flanders
Rod Flanders
Todd Flanders
Moe Szyslak

Dies ist die falsch Art, es zu tun :

wiggums=$(grep -iF "Wiggum" characters.txt);
num_wiggums=$(echo "$wiggums" | wc -l);
echo "There are ${num_wiggums} here!";

Es wird uns sagen, es gibt 1 Wiggum in der Liste, auch wenn es keine gibt.

Stattdessen müssen Sie eine zusätzliche Prüfung durchführen, um festzustellen, ob die Variable leer ist ( -z (wie in "ist Null"). Wenn grep nichts zurückgegeben hat, ist die Variable leer.

matches=$(grep -iF "VanHouten" characters.txt);

if [ -z "$matches" ]; then
    num_matches=0;
else
    num_matches=$(echo "$matches" | wc -l);
fi

echo "There are ${num_matches} VanHoutens on the list";

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X