Sök…


parametrar

Parameter detaljer
IFS Intern fältavskiljare
fil Ett filnamn / sökväg
-r Förhindrar tolkning av backslash när den används med läst
-t Tar bort en efterföljande ny linje från varje rad läst av readarray
-d DELIM Fortsätt tills DELIMs första tecken är läst (med read ), snarare än ny linje

Läser fil (/ etc / passwd) rad för rad och fält för fält

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

I unix-lösenordsfil lagras användarinformation rad för rad, varje rad består av information för en användare separerad med kolon (:) -tecken. I det här exemplet, medan du läser filen rad för rad, delas linjen också i fält med kolonstecken som avgränsare, vilket indikeras av värdet som ges för IFS.

Provinmatning

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

Provutgång

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

För att läsa rad för rad och ha hela raden tilldelad variabeln är följande en modifierad version av exemplet. Observera att vi bara har en variabel per namnrad som nämns här.

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

Provinmatning

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

Provutgång

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

Läs rader i en fil i en matris

readarray -t arr <file

Eller med en slinga:

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

Looping genom en fil rad för rad

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

Om filen kanske inte innehåller en ny linje i slutet, gör så:

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

Läs linjer i en sträng i en matris

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

eller med en slinga:

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

Looping genom en sträng rad för rad

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

eller

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

Looping genom utgången från en kommando rad för rad

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

eller med ett rör:

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

Läs ett filfält för fält

Låt oss anta att fältseparator är : (kolon) i Fil.

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

För ett innehåll:

first : se
con
d:
    Thi rd:
    Fourth

Utgången är:

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

Läs ett strängfält för fält

Låt oss anta att fältavskiljaren är :

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

Produktion:

-line-
- 1
line-
- 2
line3
-

Läs fält i en fil i en matris

Låt oss anta att fältavskiljaren är :

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

Läs fält i en sträng i en matris

Låt oss anta att fältavskiljaren är :

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

Produktion:

newline

Looping genom utgången från ett kommandofält för fält

Låt oss anta att fältavskiljaren är :

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

Eller med ett rör:

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow