Recherche…


Paramètres

Paramètre Détails
IFS Séparateur de champ interne
fichier Un nom de fichier / chemin
-r Empêche l'interprétation de la barre oblique inverse lorsqu'elle est utilisée avec read
-t Supprime une nouvelle ligne de chaque ligne lue par readarray
-d DELIM Continuer jusqu'à ce que le premier caractère de DELIM soit lu (avec read ), plutôt que newline

Lit le fichier (/ etc / passwd) ligne par ligne et champ par champ

#!/bin/bash
FILENAME="/etc/passwd"
while IFS=: read -r username password userid groupid comment homedir cmdshell
do
  echo "$username, $userid, $comment $homedir"
done < $FILENAME

Dans le fichier de mots de passe Unix, les informations utilisateur sont stockées ligne par ligne, chaque ligne étant constituée d'informations pour un utilisateur séparé par deux points (:). Dans cet exemple, lors de la lecture ligne par ligne du fichier, la ligne est également divisée en champs utilisant le caractère deux-points comme délimiteur indiqué par la valeur donnée pour IFS.

Entrée de l'échantillon

mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin

Échantillon sortie

mysql, 27, MySQL Server /var/lib/mysql
pulse, 497, PulseAudio System Daemon /var/run/pulse
sshd, 74, Privilege-separated SSH /var/empty/sshd
tomcat, 91, Apache Tomcat /usr/share/tomcat6
webalizer, 67, Webalizer /var/www/usage

Pour lire ligne par ligne et avoir la ligne entière affectée à la variable, voici une version modifiée de l'exemple. Notez que nous avons une seule variable par nom de ligne mentionnée ici.

#!/bin/bash
FILENAME="/etc/passwd"
while IFS= read -r line
do
  echo "$line"
done < $FILENAME

Entrée d'échantillon

mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin

Échantillon sortie

mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin

Lire les lignes d'un fichier dans un tableau

readarray -t arr <file

Ou avec une boucle:

arr=()
while IFS= read -r line; do
   arr+=("$line")
done <file

Traverser un fichier ligne par ligne

while IFS= read -r line; do
   echo "$line"
done <file

Si le fichier ne contient pas de nouvelle ligne à la fin, alors:

while IFS= read -r line || [ -n "$line" ]; do
   echo "$line"
done <file

Lire les lignes d'une chaîne dans un tableau

var='line 1
line 2
line3'
readarray -t arr <<< "$var"

ou avec une boucle:

arr=()
while IFS= read -r line; do
   arr+=("$line")
done <<< "$var"

En boucle à travers une chaîne ligne par ligne

var='line 1
line 2
line3'
while IFS= read -r line; do
   echo "-$line-"
done <<< "$var"

ou

readarray -t arr <<< "$var"
for i in "${arr[@]}";do
    echo "-$i-"
done

Faire défiler la sortie d'une ligne de commande ligne par ligne

while IFS= read -r line;do
    echo "**$line**"
done < <(ping google.com)

ou avec une pipe:

ping google.com |
while IFS= read -r line;do
    echo "**$line**"
done

Lire un champ de fichier par champ

Supposons que le séparateur de champs soit : (deux-points) dans le fichier .

while IFS= read -d : -r field || [ -n "$field" ]; do
   echo "$field"
done <file

Pour un contenu:

first : se
con
d:
    Thi rd:
    Fourth

La sortie est la suivante:

**first **
** se
con
d**
**
    Thi rd**
**
    Fourth
**

Lire un champ de chaîne par champ

Supposons que le séparateur de champs est :

var='line: 1
line: 2
line3'
while IFS= read -d : -r field || [ -n "$field" ]; do
   echo "-$field-"
done <<< "$var"

Sortie:

-line-
- 1
line-
- 2
line3
-

Lire les champs d'un fichier dans un tableau

Supposons que le séparateur de champs est :

arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
   arr+=("$field")
done <file

Lire les champs d'une chaîne dans un tableau

Supposons que le séparateur de champs est :

var='1:2:3:4:
newline'
arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
   arr+=("$field")
done <<< "$var"
echo "${arr[4]}"

Sortie:

newline

En boucle à travers la sortie d'un champ de commande par champ

Supposons que le séparateur de champs est :

while IFS= read -d : -r field || [ -n "$field" ];do
    echo "**$field**"
done < <(ping google.com)

Ou avec une pipe:

ping google.com | while IFS= read -d : -r field || [ -n "$field" ];do
    echo "**$field**"
done


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow