$IFS

Det finns en inbyggd shell-variabel, $IFS (Internal Field Separator). Den används automatiskt för att avgöra hur tex word-splitting ska göras vid expansion eller när vi använder read-variabeln. Den innehåller per default space, tab, newline och således är det så som det kommer bli uppdelat. Vi kan peta på den och bestämma hur vi vill att det ska delas.

Vi tittar på hur word-splitting används med IFS i defaultläge:

#!/usr/bin/env bash
#
# An example script on IFS and word splitting

sentence="Bash is awesome"

for word in $sentence
do
    echo "$word"
done

Här får vi resultatet:

Bash
is
awesome

Det fungerar ju precis om planerat. Om vi hade haft en annan sträng att jobba med kanske vi hade behövt ändra IFS:

#!/usr/bin/env bash
#
# An example script on IFS and word splitting

sentence="Bash:is:awesome"

for word in $sentence
do
    echo "$word"
done

Här delas det inte som vi vill:

Bash:is:awesome

Vi behöver då ändra IFS.

#!/usr/bin/env bash
#
# An example script on IFS and word splitting

sentence="Bash:is:awesome"

# Change the IFS
IFS=":"

for word in $sentence
do
    echo "$word"
done

Nu delas strängen upp efter den avgränsare, (delimiter), vi satt:

Bash
is
awesome

Om vi vill ändra på IFS kan det vara bra att återställa den när man är klar. Den återställs automatiskt när vi avslutat scriptet men ändrar vi mitt i kan vi behöva återställa den. Ta bara en backup innan du ändrar den:

#!/usr/bin/env bash
#
# An example script on IFS and word splitting

IFS_BACKUP=$IFS

# ...
# Do something with $IFS
# ...

# Reset the value
IFS=$IFS_BACKUP

# Continue with the default values

Tips 1: Se vad IFS innehåller: echo "$IFS" | cat -ETv
Tips 2: läs gärna mer om IFS

#Revision history

  • 2019-03-08: (A, lew) Första versionen.

Document source.