
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 $arglist
durch 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