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.

144voto

Ignacio Vazquez-Abrams Punkte 735200

Zitate sind wichtig.

echo "$var" | wc -l

126voto

Julian Punkte 3612

Die akzeptierte Antwort und andere hier gepostete Antworten funktionieren nicht im Falle einer leeren Variablen (undefinierte oder leere Zeichenkette).

Das funktioniert:

echo -n "$VARIABLE" | grep -c '^'

Zum Beispiel:

ZERO=
ONE="just one line"
TWO="first
> second"

echo -n "$ZERO" | grep -c '^'
0
echo -n "$ONE" | grep -c '^'
1
echo -n "$TWO" | grep -c '^'
2

34voto

speakr Punkte 4041

Eine andere Möglichkeit ist die hier Zeichenketten in der Bash:

wc -l <<< "$var"

Wie bereits in dieser Kommentar eine leere $var wird 1 Zeile statt 0 Zeilen ergeben, weil hier Zeichenketten in diesem Fall ein Zeilenumbruchzeichen hinzufügen ( Erklärung ).

14voto

haqk Punkte 135

Niemand hat die Parametererweiterung erwähnt, daher hier ein paar Möglichkeiten, die reine Bash zu verwenden.

Methode 1

Nicht-Zeilenumbruch-Zeichen entfernen, dann Länge der Zeichenkette + 1 ermitteln. Zitate sind wichtig .

 var="${var//[!$'\n']/}"
 echo $((${#var} + 1))

Methode 2

In Array umwandeln, dann Array-Länge ermitteln. Damit dies funktioniert, dürfen Sie keine Anführungszeichen verwenden .

 set -f # disable glob (wildcard) expansion
 IFS=$'\n' # let's make sure we split on newline chars
 var=(${var})
 echo ${#var[@]}

13voto

Stilez Punkte 548

Eine einfachere Version der Antwort von @Julian, die für alle Zeichenketten funktioniert, mit oder ohne Endung \n (es zählt eine Datei, die nur eine einzige nachgestellte \n als leer):

printf "%s" "$a" | grep -c "^"

  • Rückgabe Null: nicht gesetzte Variable, leere Zeichenkette, Zeichenkette mit leerem Zeilenumbruch
  • Rückgabe 1: eine beliebige nicht leere Zeile, mit oder ohne nachgestellten Zeilenumbruch
  • usw.

Sortie :

# a=
# printf "%s" "$a" | grep -c "^"
0

# a=""
# printf "%s" "$a" | grep -c "^"
0

# a="$(printf "")"
# printf "%s" "$a" | grep -c "^"
0

# a="$(printf "\n")"
# printf "%s" "$a" | grep -c "^"
0

# a="$(printf " \n")"
# printf "%s" "$a" | grep -c "^"
1

# a="$(printf " ")"
# printf "%s" "$a" | grep -c "^"
1

# a="aaa"
# printf "%s" "$a" | grep -c "^"
1

# a="$(printf "%s" "aaa")"
# printf "%s" "$a" | grep -c "^"
1

# a="$(printf "%s\n" "aaa")"
# printf "%s" "$a" | grep -c "^"
1

# a="$(printf "%s\n%s" "aaa" "bbb")"
# printf "%s" "$a" | grep -c "^"
2

# a="$(printf "%s\n%s\n" "aaa" "bbb")"
# printf "%s" "$a" | grep -c "^"
2

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