Sto provando a usare for
nella shell per iterare su nomi di file con spazi. Ho letto in un stackoverflow question che potrebbe essere utilizzato IFS=$'\n'
e sembra funzionare correttamente. Ho quindi letto in a comment to one of the answers che per renderlo posix compatibile per shell diverse da bash si potrebbe usare IFS=$(echo -e '\n')
.
Il primo funziona ma il secondo no. Il commento è aumentato di più volte. Ho controllato l'output e la variabile non sembra contenere la nuova riga.
#!/bin/sh
IFS=$(echo -e '\n')
echo -n "$IFS" | od -t x1
for file in `printf 'one\ntwo two\nthree'`; do
echo "Found $file"
done
echo
IFS=$'\n'
echo -n "$IFS" | od -t x1
for file in `printf 'one\ntwo two\nthree'`; do
echo "Found $file"
done
L'output mostra il separatore di campo mancante per primo:
0000000
Found one
two two
three
Ma è adeguata al secondo:
0000000 0a
0000001
Found one
Found two two
Found three
Ho trovato un domanda ha risposto che può o non può essere un duplicato della mia domanda:
linux - When setting IFS to split on newlines, why is it necessary to include a backspace? - Stack Overflow
Esiste un pericolo per fare ciò che è discusso qui, IFS=$(echo -en '\n\b')
? Perché quello aggiunge uno \b
a IFS (ho controllato). Può un \b
verificarsi in un nome di file? Non voglio che il mio codice divida per errore un nome di file.
Hai anche qualche consiglio su come gestire correttamente il ripristino di IFS dopo il ciclo for
? Dovrei archiviarlo in una variabile temporanea, o eseguire IFS e l'istruzione for in una subshell? (E come fare?) Grazie
Grazie per le informazioni che mi terrò a mente – user2672807
Si prega di rimuovere il secondo esempio in quanto non è pulito: 'IFS = "$ (printf '\ n +')"' '$ echo - n "$ IFS" | xxd' '00000000: 0a2b' <- Questo aggiunge' + 'anche a IFS. –
@TomHale Ho rimosso il + che non era necessario –