108 votes

En bash, comment compter le nombre de lignes dans une variable ?

J'ai une variable qui contient une chaîne et je dois vérifier si elle contient des lignes :

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

pseudo-code :

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

C'est mon idée sur la façon de le vérifier. echo $var | wc -l ne fonctionne pas - il indique toujours 1 , même s'il contient 3 .

echo -e ne fonctionne pas aussi bien.

131voto

Ignacio Vazquez-Abrams Points 312628

Les citations comptent.

 echo "$var" | wc -l

109voto

Julian Points 1209

La réponse acceptée et les autres réponses publiées ici ne fonctionnent pas en cas de variable vide (chaîne non définie ou vide).

Cela marche:

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

Par example:

 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

13voto

haqk Points 101

Personne n'a mentionné l'expansion des paramètres, voici donc quelques façons d'utiliser le bash pur.

Méthode 1

Supprimez les caractères autres que la nouvelle ligne, puis obtenez une longueur de chaîne + 1. Les guillemets sont importants .

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

Méthode 2

Convertir en tableau, puis obtenir la longueur du tableau. Pour que cela fonctionne, n'utilisez pas de guillemets .

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

13voto

Stilez Points 508

Une version plus simple de la réponse de @Julian, qui fonctionne pour toutes les chaînes, avec ou sans \n de fin (il compte un fichier contenant un seul \n de fin comme vide):

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

  • Renvoie zéro : variable non définie, chaîne vide, chaîne contenant une nouvelle ligne nue
  • Renvoie 1 : toute ligne non vide, avec ou sans retour à la ligne
  • etc

Production:

 # 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X