Bash, leggere riga per riga dal file, con IFS

Sto avendo questo codice da http://bash.cyberciti.biz/guide/While_loop, utilizzato per leggere riga per riga da un file

file=/etc/resolv.conf
while IFS= read -r line
do
        # echo line is stored in $line
    echo $line
done < "$file"

parte non capisco è IFS= e come contribuisce a questa funzionalità. Può qualcuno spiegare questo a me? Grazie.

InformationsquelleAutor wakandan | 2010-12-08



4 Replies
  1. -5

    IFS è una variabile per il separatore di riga (o di realtà “Interna Separatore di Campo”). Codice efficacemente svuotare il separatore di riga per il comando di lettura e impostare il suo valore di default. A volte IFS è cambiato da qualche altra parte del codice a causa di utenti che vogliono gli altri “linea” finali, come la lettura di una frase alla volta (IFS=.) o simili.

    Credo che il IFS= qui solo per assicurarsi che funziona o tutti, indipendentemente dal valore precedente la variabile IFS. Il codice dovrebbe funzionare senza IFS=

    • è vero, senza IFS= è funziona ancora bene. Grazie mille.
    • solo una cosa rapida, siamo in grado di mettere un tale incarico IFS= e read -r line in una stessa riga? È permesso?
    • user121870, sì, è permesso. Quando mettere le variabili di fronte a un comando egli variabile sarà visibile a comando solo. Questo vale per tutti i comandi Bash, anche quelli scrivete nel terminale di te. Provate, per esempio, questo comando: “MANWIDTH=20 man bash”.
    • E ‘ geniale! Grazie mille.
    • Impostazione IFS per un valore null non viene impostata di default (che è lo spazio, tab, newline). Non è per i terminatori di linea, è usato per fare la suddivisione in parole. Per leggere una frase alla volta, è possibile utilizzare il -d opzione delimitatore con read.
    • Questa risposta non è corretta — IFS è impostata su una stringa vuota per evitare read da stripping gli spazi iniziali e finali di ogni riga.
    • IFS non è un separatore di riga, è un campo separatore. Questo significa che è usato per separare le due linee e all’interno linee. Ma in questo caso, dal momento che si utilizza read con una singola variabile di output, funziona. Per esempio, se si desidera analizzare /etc/resolv.conf velocemente, è possibile utilizzare while IFS=' ' read -r name address per dividere i campi nella stessa operazione.

  2. 36

    In questo caso, IFS è impostata su una stringa vuota per evitare read da stripping gli spazi iniziali e finali dalla linea.

    Modifica IFS di solito è fatto per controllare la modalità di ingresso verrà diviso in più campi. Ma in questo caso, perché c’è solo una variabile di nome dato a read, read non potrà mai dividere l’input in più campi, indipendentemente dal valore del IFS. Sarà, tuttavia, rimuovere gli spazi iniziali e finali come di un mandato di specifiche POSIX (supponendo che il valore di IFS contiene spazi o viene annullato).

    Vedere le specifiche POSIX, per leggi e campo di scissione per i dettagli su come funziona.

    • +1 per dare la risposta corretta.
  3. 3

    Nel terzo esempio di quella pagina, impostazione IFS null impedisce la suddivisione in parole che rende quel codice non funziona. Ecco il codice:

    while IFS= read -r field1 field2 field3 ... fieldN
    do
        command1 on $field1
        command2 on $field1 and $field3
        ..
        ....
        commandN on $field1 ... $fieldN
    done < "/path/to dir/file name with space"

    Come scritto, tutte le parole di una linea sono memorizzati in field1 e field2, ecc…. sono vuoti. Modificare la riga di questo e funziona correttamente:

    while read -r field1 field2 field3 ... fieldN
  4. -3

    Per rendere IFS una vera separatore di riga, utilizzare IFS=$'\012'.

    • Lei non ha risposto alla domanda. La domanda era per spiegare la parte IFS= nel comando, e spiegare il suo utilizzo. E dal modo in cui, IFS=$'\n' sarebbe (probabilmente) meno criptico.
    • Tutto vero. Ma quella parte che ha sostanzialmente risposto sopra, e questi sono i dettagli scabrosi. Forse questa domanda dovrebbe essere considerato una risposta.
    • Se la domanda è già stato risposto, quindi non c’è da aggiungere che le risposte che non rispondono alla domanda. Oh beh, è una tua scelta; forse sarà anche ottenere upvotes per che. O non. Aspettare e vedere.

Lascia un commento