Szukaj…


Parametry

Parametr Detale
IFS Separator pola wewnętrznego
plik Nazwa pliku / ścieżka
-r Zapobiega interpretacji ukośnika odwrotnego, gdy jest używany z odczytem
-t Usuwa końcowy znak nowej linii z każdej linii czytanej przez readarray
-d DELIM Kontynuuj, dopóki nie zostanie odczytany pierwszy znak DELIM (z read ), a nie nowa linia

Czyta plik (/ etc / passwd) wiersz po wierszu i pole po polu

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

W pliku hasła unix informacje o użytkowniku są przechowywane linia po linii, każda linia składa się z informacji dla użytkownika oddzielonych dwukropkiem (:). W tym przykładzie podczas odczytu pliku linia po linii linia jest również dzielona na pola przy użyciu znaku dwukropka jako separatora, co jest wskazywane przez wartość podaną dla IFS.

Przykładowe dane wejściowe

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

Przykładowe dane wyjściowe

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

Aby odczytać wiersz po wierszu i przypisać całą linię do zmiennej, poniżej znajduje się zmodyfikowana wersja przykładu. Zauważ, że mamy tutaj tylko jedną zmienną według linii nazwy.

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

Przykładowe dane wejściowe

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

Przykładowe dane wyjściowe

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

Wczytaj wiersze pliku do tablicy

readarray -t arr <file

Lub z pętlą:

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

Pętla przez plik linia po linii

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

Jeśli plik może nie zawierać nowego wiersza na końcu, to:

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

Wczytaj wiersze łańcucha do tablicy

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

lub z pętlą:

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

Pętla przez linię po linii

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

lub

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

Pętla przechodząca przez wyjście wiersza poleceń linia po linii

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

lub z rurą:

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

Przeczytaj plik pole po polu

Załóżmy, że separatorem pól jest : (dwukropek) w pliku pliku .

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

W przypadku treści:

first : se
con
d:
    Thi rd:
    Fourth

Dane wyjściowe to:

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

Przeczytaj ciąg znaków pole po polu

Załóżmy, że separatorem pól jest :

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

Wynik:

-line-
- 1
line-
- 2
line3
-

Wczytaj pola pliku do tablicy

Załóżmy, że separatorem pól jest :

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

Wczytaj pola ciągu do tablicy

Załóżmy, że separatorem pól jest :

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

Wynik:

newline

Zapętlanie danych wyjściowych pola polecenia po polu

Załóżmy, że separatorem pól jest :

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

Lub za pomocą rury:

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow