IFS
sta per "separatore di campo interno". Viene utilizzato dalla shell per determinare come eseguire la suddivisione delle parole, ovvero come riconoscere i confini delle parole.
Prova questo in una shell come bash (altre shell possono gestirlo in modo diverso, ad esempio zsh):
mystring="foo:bar baz rab"
for word in $mystring; do
echo "Word: $word"
done
Il valore predefinito per è IFS
costituito da caratteri spazi bianchi (per essere precisi: spazio, tabulazione e nuova riga). Ogni personaggio può essere un limite di parole. Quindi, con il valore predefinito di IFS
, il ciclo sopra verrà stampato:
Word: foo:bar
Word: baz
Word: rab
In altre parole, la shell pensa che lo spazio bianco sia un limite di parole.
Ora prova a impostare IFS=:
prima di eseguire il ciclo. Questa volta, il risultato è:
Word: foo
Word: bar baz rab
Ora, anche il guscio si divide mystring
in parole, ma ora tratta solo i due punti come il limite delle parole.
Il primo carattere di IFS
è speciale: viene utilizzato per delimitare le parole nell'output quando si utilizza la $*
variabile speciale (esempio preso dalla Guida allo scripting Advanced Bash , dove è anche possibile trovare ulteriori informazioni su variabili speciali come quella):
$ bash -c 'set w x y z; IFS=":-;"; echo "$*"'
w:x:y:z
Paragonare a:
$ bash -c 'set w x y z; IFS="-:;"; echo "$*"'
w-x-y-z
Si noti che in entrambi gli esempi, il guscio sarà ancora trattare tutti i personaggi :
, -
e ;
come i confini di parola. L'unica cosa che cambia è il comportamento di $*
.
Un'altra cosa importante da sapere è come viene trattato il cosiddetto "spazio bianco IFS" . Fondamentalmente, non appena IFS
include i caratteri degli spazi bianchi, lo spazio bianco iniziale e finale viene rimosso dalla stringa da dividere prima di elaborarlo e una sequenza di caratteri di spazi bianchi consecutivi delimita anche i campi. Tuttavia, questo vale solo per quei caratteri di spazi bianchi che sono effettivamente presenti in IFS
.
Ad esempio, diamo un'occhiata alla stringa "a:b:: c d "
(spazio finale e due caratteri spaziali tra c
e d
).
- Con
IFS=:
esso sarà suddiviso in quattro campi: "a"
, "b"
, ""
(stringa vuota) e " c d "
(di nuovo, due spazi tra c
e d
). Nota lo spazio bianco iniziale e finale nell'ultimo campo.
- Con
IFS=' :'
, esso sarà suddiviso in cinque campi: "a"
, "b"
, ""
(stringa vuota), "c"
e "d"
. Nessuno spazio bianco iniziale e finale da nessuna parte.
Nota come più caratteri di spazi bianchi consecutivi delimitano due campi nel secondo esempio, mentre non lo fanno più due punti consecutivi consecutivi (poiché non sono caratteri di spazi bianchi).
Per quanto riguarda IFS=$'\n'
, cioè una ksh93
sintassi supportata anche da bash
, zsh
, mksh
e FreeBSD sh
(con variazioni tra tutte le shell). Citando la manpage di bash:
Le parole del modulo $ 'stringa' sono trattate in modo speciale. La parola si espande in "stringa", con i caratteri con escape backslash sostituiti come specificato dallo standard ANSI C.
\n
è la sequenza di escape per una nuova riga, quindi IFS
finisce per essere impostata su un singolo carattere di nuova riga.