Wenden Sie Parametererweiterungsflags auf Zeichenfolgen- oder Arrayliterale in zsh an

Wenden Sie Parametererweiterungsflags auf Zeichenfolgen- oder Arrayliterale in zsh an

Manchmal möchte ich Parametererweiterungsflags auf einen String oder ein Arrayliteral in zsh anwenden. Als Anwendungsbeispiel nehmen wir an, ich möchte einen durch Kommas getrennten String $arglistdurch Kommas teilen, aber etwas davor stellen. Es wäre schön, wenn man das tun könnte:

${(s/,/)arg1,arg2,$restofarglist}

Natürlich gibt es andere Möglichkeiten, dieses spezielle Problem zu lösen, und ich weiß, dass ich immer zuerst einem Parameter etwas zuweisen und dann die Flags anwenden kann. Aber die Frage ist: Kann ich Flags irgendwie direkt auf ein Literal anwenden?

Antwort1

Ich glaube, Sie suchen nach :-einer Parametersubstitution:

$ restofarglist='abc,def'
$ echo ${(s/,/)${:-arg1,arg2,$restofarglist}}
arg1 arg2 abc def

Von man zsh:

${name:-word}
              If name is set, or in the second form is non-null, then substitute its value;
              otherwise substitute word.  In the second form name may be omitted, in  which
              case word is always substituted.

Eigentlich kann man dieses Beispiel auch etwas kürzer machen:

$ echo ${${:-arg1,arg2,$restofarglist}//,/ }
arg1 arg2 abc def

verwandte Informationen