Sådan Itererer Du Korrekt Over Linjer i Bash: Variabler og Kommando Output

Hvordan itereres korrekt over linjer i bash, enten i en variabel eller fra output af en kommando? At sætte IFS-variablen til en ny linje virker for output af en kommando, men ikke når man behandler en variabel, der indeholder nye linjer.

Præmissen om korrekt iteration over linjer i bash kan håndteres ved at bruge en while-løkke med IFS= read -r for både kommandooutput og variabler, eller ved at anvende mapfile til at læse linjer ind i et array.

Hvordan itereres korrekt over linjer i bash, enten i en variabel eller fra output af en kommando?

At iterere over linjer i bash kan gøres på flere måder, afhængigt af om du arbejder med output fra en kommando eller en variabel, der indeholder nye linjer. Her er nogle metoder til at gøre dette korrekt:

Iterere over output fra en kommando

For at iterere over output fra en kommando kan du bruge en while-løkke sammen med read. Dette sikrer, at hver linje behandles korrekt.

command_output=$(some_command)
while IFS= read -r line; do
    echo "$line"
done <<< "$command_output"

Iterere over en variabel med nye linjer

Når du arbejder med en variabel, der indeholder nye linjer, kan du bruge en while-løkke med read og her er det vigtigt at bruge IFS korrekt.

variable="line1
line2
line3"
while IFS= read -r line; do
    echo "$line"
done <<< "$variable"

Alternativ metode ved brug af mapfile

En anden metode til at iterere over linjer i en variabel er at bruge mapfile (eller readarray), som læser linjerne ind i et array.

variable="line1
line2
line3"
mapfile -t lines <<< "$variable"
for line in "${lines[@]}"; do
    echo "$line"
done

Opsummering

  • Brug en while-løkke med IFS= read -r for at iterere over output fra en kommando.
  • Brug en while-løkke med IFS= read -r for at iterere over en variabel med nye linjer.
  • Overvej at bruge mapfile til at læse linjer ind i et array og iterere over arrayet.