Primero, supongo que el uso de lses solo un ejemplo. No puede analizar la salida de lsen 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 lscomando es
hello world
wibble
a continuación, files=($(ls))coloca la filesmatriz para contener 3 elementos: hello, worldy 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 sbandera, por ejemplo, "${(@s:,:)…}"para dividir en comas; la fbandera 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 $filesquitar los elementos vacíos (aquí, no importa porque los elementos no estarán vacíos).
print $finterpreta $fcomo un interruptor si comienza con -ay expande las barras invertidas $f. Use print -r -- $f, o print -rn -- $fsi no desea agregar una nueva línea después de la cadena.
(…)son necesarios para quefilessea una matriz y no una cadena (que contendría la concatenación de las líneas del comando, deshaciendo la división realizada por(f)). 2. Confoo=$'one\n\nthree', contrastprint -rl $ {(f) foo} `yprint "${(@f)foo}". Las comillas dobles son necesarias para retener líneas vacías, de las cuales no obtendrálspero que pueden ocurrir con otros comandos.En zsh puede usar la expansión del shell que no realiza la división de palabras por defecto. Tratar
fuente