Primero, supongo que el uso de ls
es solo un ejemplo. No puede analizar la salida de ls
en ningún shell, porque es ambiguo. Lea Por qué no debe analizar la salida de ls (1) si esto es nuevo para usted. En cualquier shell, para obtener una lista de archivos, use comodines, por ejemplo files=(*)
.
En zsh, como en otros shells, el resultado de la sustitución de comandos se divide en palabras en los espacios en blanco (más precisamente, de acuerdo con el valor de IFS
). (A diferencia de otros shells, el resultado de la sustitución del comando no está sujeto a glob en zsh). Entonces, si la salida del ls
comando es
hello world
wibble
a continuación, files=($(ls))
coloca la files
matriz para contener 3 elementos: hello
, world
y wibble
.
Si la sustitución del comando está entre comillas dobles, no se realiza ninguna división. Puede realizar una división personalizada con banderas de expansión de parámetros . Use el @
indicador para indicar que el resultado de la división es una matriz (curiosamente, debe mantener la expansión entre comillas dobles, es decir "${(@)…}"
, aunque la cadena entre comillas dobles se expanda a varias palabras). Para dividir, use la s
bandera, por ejemplo, "${(@s:,:)…}"
para dividir en comas; la f
bandera se divide solo en líneas nuevas.
files=("${(@f)$(ls)}")
Tenga en cuenta que la forma correcta de iterar sobre una matriz en general es for f in $files[@]
, al $files
quitar los elementos vacíos (aquí, no importa porque los elementos no estarán vacíos).
print $f
interpreta $f
como un interruptor si comienza con -
ay expande las barras invertidas $f
. Use print -r -- $f
, o print -rn -- $f
si no desea agregar una nueva línea después de la cadena.