2011-12-30 12 views
33

Desidero eseguire un'iterazione di un elenco di file senza preoccuparsi dei caratteri che potrebbero contenere i nomi file, quindi utilizzo un elenco delimitato da caratteri null. Il codice spiegherà meglio le cose.Lettura di stringhe delimitate nulle tramite un ciclo Bash

# Set IFS to the null character to hopefully change the for..in 
# delimiter from the space character (sadly does not appear to work). 
IFS=$'\0' 

# Get null delimited list of files 
filelist="`find /some/path -type f -print0`" 

# Iterate through list of files 
for file in $filelist ; do 
    # Arbitrary operations on $file here 
done 

Il seguente codice funziona quando si legge da un file, ma ho bisogno di leggere da una variabile contenente testo.

while read -d $'\0' line ; do 
    # Code here 
done < /path/to/inputfile 
+1

Non penso sia possibile memorizzare caratteri null in una variabile bash. Almeno, non ho mai trovato il modo di farlo ... –

risposta

53

In bash è possibile utilizzare una stringa here

while IFS= read -r -d '' line ; do 
    # Code here 
done <<<"$var" 

nota che si dovrebbe inline il IFS= e basta usare -d '' ma assicurarsi che ci sia uno spazio tra la 'd' e il primo singolo -citazione. Inoltre, aggiungi il flag -r per ignorare gli escape.

Inoltre, questo non fa parte della tua domanda, ma potrei suggerire un modo migliore di fare lo script quando si utilizza find; usa la sostituzione di processo.

while IFS= read -r -d '' file; do 
    # Arbitrary operations on "$file" here 
done < <(find /some/path -type f -print0) 
+0

Eccellente, esattamente quello che stavo cercando. Grazie! Ho finito per usare il tuo secondo esempio. – Matthew

+0

Qual è l'uso dell'IFS da quando è impostato l'indicatore -d? – thisirs

+4

@thisirs Impostando 'IFS' sulla stringa nulla, i caratteri di spaziatura iniziale e finale verranno mantenuti. – toxalot