Jedes Array-Element über Parametererweiterung anhängen (ändern) (dh ohne printf)?

8

Lassen Sie das Skript unten mein Dilemma veranschaulichen.

#!/bin/zsh

STUFF=( moose-hoof ovary clydsedale )

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

MEIN Elchhuf MEIN Eierstock MEIN Clydsedale

Elchhuf Eierstock Clydsedale

Was sind die richtigen Erweiterungsflags, um die Verkettung von Zeichenfolgen für jedes Element des Arrays zu ermöglichen?

alex grau
quelle

Antworten:

16

Verwenden Sie $^array.

Es verwandelt das Array in eine Art Klammererweiterung des Arrays. Wie in , wenn a=(foo bar baz), $^awürde wie ein bisschen sein {foo,bar,baz}.

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

Für Multiplexing- Arrays:

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

Wenn das Präfix oder Suffix Shell-Sonderzeichen enthält (so ;werden Befehle oder Leerzeichen getrennt, die Wörter trennen, oder $"'&*[?~...), müssen diese natürlich in Anführungszeichen gesetzt werden:

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

das gleiche wie für csh's (und bash, ksh, zsh's):

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

$^aselbst darf nicht zitiert werden, "foo${^a}bar"würde sich als ein Wort erweitern. Ein Fall, in dem Sie $^arrayzitiert werden möchten , ist der gleiche, in dem $arraySie leere Elemente beibehalten möchten. Dann müssen Sie die Array-Erweiterung zitieren und das (@)Flag oder die "${array[@]}"Syntax verwenden (die an die Bourne-Shell erinnert "$@"):

$ 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>
<>
Stéphane Chazelas
quelle
Leider funktioniert das bei mir nicht .. echo "number ${^$(seq 3)} "-> number 1 2 3oder Z=( $(seq 3) ); echo "number ${^Z}"->number 1 2 3
alex grey
@don_crissti Nur nachdem Sie Ihren letzten Vorschlag ausprobiert haben, echo "number "${^$(seq 3)}""würde es funktionieren. Ich habe noch nie doppelte Anführungszeichen in solchen doppelten Anführungszeichen gesehen. Sehr merkwürdig. Sehr schwer zu merken .. aber danke!
Alex Grey
@alexgray Es sind keine Anführungszeichen in Anführungszeichen, es ist das Präfix und Suffix, das in Anführungszeichen gesetzt wird, aber nicht ${^(seq 3)}, siehe Bearbeiten.
Stéphane Chazelas