Adjuntar (alterar) cada elemento de la matriz a través de la expansión de parameters (es decir, sin printf)?

Deje que el guión a continuación ejemplifique mi dilema …

#!/bin/zsh STUFF=( moose-hoof ovary clydsedale ) echo ${MINE=$(printf "MY-%s " $STUFF)} echo ${MINE_EXP=${STUFF/^/MY-}} 

MY-moose-hoof MI-ovario MY-clydsedale

alce ovillo clydsedale

¿Cuáles son los indicadores de expansión correctos para permitir la concatenación de cadenas en cada elemento de la matriz?

Solutions Collecting From Web of "Adjuntar (alterar) cada elemento de la matriz a través de la expansión de parameters (es decir, sin printf)?"

Usa $^array .

Convierte a la matriz en una especie de expansión ortopédica de la matriz. Como en cuando a=(foo bar baz) , $^a sería un poco como {foo,bar,baz} .

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

Para multiplexar matrices:

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

Naturalmente, si el prefijo o sufijo contiene caracteres especiales de shell (como ; que separa commands o espacio que separa palabras, o $"'&*[?~ …), se deben citar:

 echo 'prefix '$^a' suffix' 

lo mismo que para csh 's (y bash, ksh, zsh):

 echo 'prefix '{foo,bar,baz}' suffix' 

$^a no debe citarse, "foo${^a}bar" se expandiría como una sola palabra. Un caso en el que desearía cotizar $^array , lo mismo que para $array cuando desee conservar elementos vacíos. Luego, debe citar la expansión de la matriz y usar la bandera (@) o la syntax "${array[@]}" (que restring la "$@" del 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 <xx > $ printf '<%s>\n' "$^array[@]$^array[@]" # multiplexing with empties preserved <xx> <x> <x> <>