Innanzitutto, suppongo che l'uso di ls
sia solo un esempio. Non è possibile analizzare l'output di ls
in 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 ls
comando è
hello world
wibble
quindi files=($(ls))
imposta la files
matrice per contenere 3 elementi: hello
, world
e 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 s
bandiera, ad esempio "${(@s:,:)…}"
per dividere in virgole; la f
bandiera 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 $files
rimuovere gli elementi vuoti (qui, non importa perché gli elementi non saranno vuoti).
print $f
interpreta $f
un interruttore se inizia con a -
ed espande le barre rovesciate in $f
. Utilizzare print -r -- $f
o print -rn -- $f
se non si desidera aggiungere una nuova riga dopo la stringa.