Primeiro, suponho que o uso de ls
seja apenas um exemplo. Você não pode analisar a saída de ls
em qualquer shell, porque é ambíguo. Leia Por que você não deve analisar a saída de ls (1) se isso for novidade para você. Em qualquer shell, para obter uma lista de arquivos, use curingas, por exemplo. files=(*)
.
No zsh, como em outros shells, o resultado da substituição do comando é dividido em palavras em caracteres de espaço em branco (mais precisamente, de acordo com o valor de IFS
). (Ao contrário de outros shells, o resultado da substituição de comandos não está sujeito a globbing em zsh.) Portanto, se a saída do comando ls
for
hello world
wibble
, em seguida, files=($(ls))
define a matriz files
para conter 3 elementos: hello
, world
e wibble
.
Se a substituição do comando estiver entre aspas duplas, nenhuma divisão será executada. Você pode realizar uma divisão personalizada com sinalizadores de expansão de parâmetro . Use o @
flag para indicar que o resultado da divisão deve ser uma matriz (estranhamente, você precisa manter a expansão entre aspas duplas, ou seja, "${(@)…}"
, mesmo que a sequência de aspas duplas seja expandida para várias palavras) . Para divisão, use o sinalizador s
, por ex. "${(@s:,:)…}"
para dividir com vírgulas; o sinalizador f
se divide somente em novas linhas.
files=("${(@f)$(ls)}")
Observe que a maneira correta de iterar em uma matriz em geral é for f in $files[@]
, pois $files
retira os elementos vazios (aqui, não importa, porque os elementos não estarão vazios).
print $f
interpreta $f
como um switch se começar com -
e expande as barras invertidas em $f
. Use print -r -- $f
ou print -rn -- $f
se você não quiser adicionar uma nova linha após a string.