O caractere dentro dos parênteses é sinalizadores de expansão de parâmetro . Eles podem ser usados em torno de uma substituição de variável ou uma substituição de comando, por exemplo,
${(@f)SOME_VARIABLE}
${(@f)${(xyz)SOME_VARIABLE}}
${(@f)$(some-command)}
O sinalizador f
divide o resultado da expansão em novas linhas. O sinalizador @
garante que a matriz resultante seja expandida como várias palavras; Curiosamente, só tem efeito dentro de aspas duplas, onde atua como uma generalização de "$@"
.
Normalmente, esses sinalizadores são usados assim:
lines=("${(@f)$(egrep "$2" "$file")}")
Dessa forma, lines
se torna uma matriz na qual cada elemento é uma linha de saída de egrep
.
Aqui, a expansão não está em um contexto que permite várias palavras, portanto, o sinalizador @
não tem efeito. O efeito do sinalizador f
é um pouco não intuitivo: ele força um contexto de matriz, portanto as palavras separadas por IFS na saída egrep
são armazenadas em uma matriz temporária que é então unida ao primeiro caractere de IFS
. / p>
linestack=${(@f)$(egrep "$2" "$file")}
Contraste:
$ zsh -c 'a=${(f)$(echo hello world; echo wibble)}; print -lr $#a $a'
18
hello world wibble
$ zsh -c 'IFS=:$IFS; a=${(f)$(echo hello world; echo wibble)}; print -lr $#a $a'
18
hello:world:wibble
$ zsh -c 'IFS=:; a=${(f)$(echo hello world; echo wibble)}; print -lr $#a $a'
18
hello world
wibble
$ zsh -c 'a=(${(f)$(echo hello world; echo wibble)}); print -lr $#a $a'
1
hello world wibble
$ zsh -c 'a=("${(@f)$(echo hello world; echo wibble)}"); print -lr $#a $a'
2
hello world
wibble