$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.