Anexa (altera) cada elemento da matriz via expansão de parâmetro (ou seja, sem printf)?

6

Deixe o script abaixo exemplificar meu dilema ..

#!/bin/zsh

STUFF=( moose-hoof ovary clydsedale )

echo ${MINE=$(printf "MY-%s " $STUFF)}
echo ${MINE_EXP=${STUFF/^/MY-}}

MY-moose-hoof MY-ovary MY-clydsedale

moose-hoof ovary clydsedale

Quais são os flags de expansão corretos para permitir a concatenação de strings em cada elemento da matriz?

    
por alex gray 31.01.2016 / 20:40

1 resposta

12

Use $^array .

Transforma a matriz em uma espécie de expansão de chave da matriz. Como em quando a=(foo bar baz) , $^a seria um pouco como {foo,bar,baz} .

$ a=(foo bar baz)
$ echo prefix${^a}suffix
prefixfoosuffix prefixbarsuffix prefixbazsuffix

Para matrizes multiplexação :

$ a=(1 2 3) b=(a b c)
$ echo $^a$^b
1a 1b 1c 2a 2b 2c 3a 3b 3c

Naturalmente, se o prefixo ou sufixo contiver caracteres especiais de shell (como ; que separa comandos ou espaço que separam palavras ou $"'&*[?~ ...), eles devem ser citados:

echo 'p r e f i x '$^a' s u f f i x'

o mesmo que para csh (e bash, ksh, zsh's):

echo 'p r e f i x '{foo,bar,baz}' s u f f i x'

$^a em si não deve ser citado, "foo${^a}bar" expandiria como uma palavra. Um caso em que você deseja que $^array seja citado, o mesmo que para $array é quando você deseja preservar elementos vazios. Em seguida, é necessário citar a expansão da matriz e usar o sinalizador (@) ou a sintaxe "${array[@]}" (uma reminiscência do "$@" do shell Bourne):

$ array=(x '')
$ printf '<%s>\n' $array         # empties removed
<x>
$ printf '<%s>\n' "$array"       # array elts joined with spaces
<x >
$ printf '<%s>\n' "${(@)array}"  # empties preserved
<x>
<>
$ printf '<%s>\n' "$array[@]"    # empties preserved
<x>
<>
$ printf '<%s>\n' $^array$^array # empty removed
<xx>
<x>
<x>
$ printf '<%s>\n' "$^array$^array" # concatenation of joined arrays
<x x >
$ printf '<%s>\n' "$^array[@]$^array[@]" # multiplexing with empties preserved
<xx>
<x>
<x>
<>
    
por 31.01.2016 / 21:18