Primeiro, suponho que o uso de ls
é apenas um exemplo. Você não pode analisar a saída de ls
qualquer shell, porque é ambígua. Leia Por que você não deve analisar a saída de ls (1) se isso é novidade para você. Em qualquer shell, para obter uma lista de arquivos, use caracteres curinga, por exemplo files=(*)
.
No zsh, como em outros shells, o resultado da substituição de comandos é dividido em palavras com caracteres de espaço em branco (mais precisamente, de acordo com o valor de IFS
). (Diferentemente de outros shells, o resultado da substituição do comando não está sujeito a globbing no zsh.) Portanto, se a saída do ls
comando for
hello world
wibble
em seguida, files=($(ls))
define a files
matriz para conter 3 elementos: hello
, world
e wibble
.
Se a substituição do comando estiver entre aspas duplas, nenhuma divisão será realizada. Você pode executar uma divisão personalizada com sinalizadores de expansão de parâmetro . Use o @
sinalizador para indicar que o resultado da divisão será uma matriz (estranhamente, é necessário manter a expansão entre aspas duplas, ou seja "${(@)…}"
, mesmo que a cadeia de aspas duplas se expanda para várias palavras). Para dividir, use a s
bandeira, por exemplo, "${(@s:,:)…}"
para dividir por vírgulas; a f
bandeira se divide apenas em novas linhas.
files=("${(@f)$(ls)}")
Observe que a maneira correta de iterar sobre uma matriz em geral é for f in $files[@]
, como $files
retira elementos vazios (aqui, isso não importa porque os elementos não estarão vazios).
print $f
interpreta $f
como uma opção se começar com -
ae expandir barras invertidas $f
. Use print -r -- $f
ou print -rn -- $f
se você não quiser adicionar uma nova linha após a sequência.
(…)
é necessário para quefiles
seja uma matriz e não uma string (que conteria a concatenação das linhas do comando, desfazendo a divisão feita por(f)
). 2. Comfoo=$'one\n\nthree', contrast
print -rl $ {(f) foo} `eprint "${(@f)foo}"
. As aspas duplas são necessárias para manter as linhas vazias, das quais você não obterá,ls
mas pode acontecer com outros comandos.No zsh, você pode usar a expansão do shell, que não executa a divisão de palavras por padrão. Experimentar
fonte