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?

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> <>