I seguenti pochi thread su questo sito e StackOverflow sono stati utili per capire come IFS
funziona:
- Cos'è l'IFS nel contesto di ciclo continuo?
- Come scorrere le righe di un file
- Bash, leggi riga per riga da file, con IFS
Ma ho ancora alcune brevi domande. Ho deciso di chiedere loro nello stesso post poiché penso che possa aiutare i futuri lettori migliori:
1° trimestre. IFS
è tipicamente discusso nel contesto della "divisione del campo". È divisione del campo lo stesso della divisione delle parole ?
Q2: La specifica POSIX dice:
Se il valore di IFS è nullo, non verrà eseguita alcuna suddivisione del campo.
Sta impostando IFS=
come impostare IFS
a nulla? È questo ciò che si intende impostandolo su una empty string
anche tu?
T3: Nella specifica POSIX, ho letto quanto segue:
Se IFS non è impostato, la shell si comporterà come se il valore di IFS fosse<space>, <tab> and <newline>
Supponi di voler ripristinare il valore predefinito di IFS
. Come lo faccio? (più nello specifico, come faccio a fare riferimento a <tab>
e <newline>
?)
Q4: Infine, come sarebbe questo codice:
while IFS= read -r line
do
echo $line
done < /path_to_text_file
comportarsi se cambiamo la prima riga in
while read -r line # Use the default IFS value
oppure a:
while IFS=' ' read -r line
Risposta accettata:
- Sì, sono la stessa cosa.
- Sì.
- In bash e in shell simili, potresti fare qualcosa come
IFS=$' tn'
. Altrimenti, puoi inserire i codici di controllo letterali usando[space] CTRL+V [tab] CTRL+V [enter]
. Se hai intenzione di farlo, tuttavia, è meglio utilizzare un'altra variabile per memorizzare temporaneamente il vecchioIFS
valore, quindi ripristinarlo in seguito (o sovrascriverlo temporaneamente per un comando utilizzando il comandovar=foo command
sintassi). - Il primo frammento di codice metterà l'intera riga letta, testualmente, in
$line
, poiché non ci sono separatori di campo per i quali eseguire la divisione delle parole. Tieni presente, tuttavia, che poiché molte shell utilizzano cstrings per memorizzare le stringhe, la prima istanza di un NUL può comunque far sembrare che venga terminata prematuramente. - Il secondo frammento di codice potrebbe non inserire una copia esatta dell'input in
$line
. Ad esempio, se sono presenti più separatori di campo consecutivi, verranno trasformati in un'unica istanza del primo elemento. Questo è spesso riconosciuto come perdita di spazio bianco circostante. - Il terzo frammento di codice funzionerà come il secondo, tranne per il fatto che verrà diviso solo su uno spazio (non il solito spazio, tabulazione o nuova riga).
- Il primo frammento di codice metterà l'intera riga letta, testualmente, in