Innanzitutto, suppongo che l'uso di lssia solo un esempio. Non è possibile analizzare l'output di lsin nessuna shell, perché è ambiguo. Leggi Perché non dovresti analizzare l'output di ls (1) se questa è una novità per te. In qualsiasi shell, per ottenere un elenco di file, utilizzare i caratteri jolly, ad es files=(*).
In zsh, come in altre shell, il risultato della sostituzione del comando è diviso in parole in caratteri di spazi bianchi (più precisamente, in base al valore di IFS). (A differenza di altre shell, il risultato della sostituzione del comando non è soggetto a globbing in zsh.) Quindi se l'output del lscomando è
hello world
wibble
quindi files=($(ls))imposta la filesmatrice per contenere 3 elementi: hello, worlde wibble.
Se la sostituzione del comando è tra virgolette, non viene eseguita alcuna divisione. È possibile eseguire una suddivisione personalizzata con flag di espansione dei parametri . Utilizzare il @flag per indicare che il risultato della divisione deve essere un array (stranamente, è necessario mantenere l'espansione tra virgolette doppie, vale a dire "${(@)…}", anche se la stringa tra virgolette si espanderà in più parole). Per dividere, utilizzare la sbandiera, ad esempio "${(@s:,:)…}"per dividere in virgole; la fbandiera si divide solo a newline.
files=("${(@f)$(ls)}")
Si noti che il modo corretto di scorrere su un array in generale è for f in $files[@], come $filesrimuovere gli elementi vuoti (qui, non importa perché gli elementi non saranno vuoti).
print $finterpreta $fun interruttore se inizia con a -ed espande le barre rovesciate in $f. Utilizzare print -r -- $fo print -rn -- $fse non si desidera aggiungere una nuova riga dopo la stringa.