Ricerca…


Parametri

Parametro Dettagli
IFS Separatore di campo interno
file Un nome di file / percorso
-r Impedisce l'interpretazione di backslash quando usato con read
-t Rimuove una nuova riga finale da ogni riga letta da readarray
-d DELIM Continua fino a leggere il primo carattere di DELIM (con read ), anziché newline

Legge il file (/ etc / passwd) riga per riga e campo per campo

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

Nel file di password di unix, le informazioni dell'utente vengono memorizzate riga per riga, ogni riga consiste di informazioni per un utente separate da due punti (:) carattere. In questo esempio durante la lettura del file riga per riga, la riga viene anche divisa in campi usando il carattere due punti come delimitatore indicato dal valore dato per IFS.

Esempio di input

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

Uscita di esempio

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

Per leggere riga per riga e avere l'intera riga assegnata alla variabile, di seguito è riportata una versione modificata dell'esempio. Si noti che abbiamo una sola variabile per linea di nome menzionata qui.

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

Ingresso di esempio

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

Uscita di esempio

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

Leggi le righe di un file in un array

readarray -t arr <file

O con un ciclo:

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

Looping di un file riga per riga

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

Se il file non può includere una nuova riga alla fine, quindi:

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

Leggi le righe di una stringa in una matrice

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

o con un ciclo:

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

Looping attraverso una stringa riga per riga

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

o

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

Ripetere l'output di una riga di comando per riga

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

o con una pipa:

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

Leggi un file campo per campo

Supponiamo che il separatore di campo sia : (due punti) nel file di file .

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

Per un contenuto:

first : se
con
d:
    Thi rd:
    Fourth

L'output è:

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

Leggi una stringa campo per campo

Supponiamo che il separatore di campo sia :

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

Produzione:

-line-
- 1
line-
- 2
line3
-

Leggi i campi di un file in un array

Supponiamo che il separatore di campo sia :

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

Leggere i campi di una stringa in una matrice

Supponiamo che il separatore di campo sia :

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

Produzione:

newline

Looping attraverso l'output di un campo di comando per campo

Supponiamo che il separatore di campo sia :

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

O con una pipa:

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow