Применить флаги расширения параметров к строковому или массивному литералу в zsh

Применить флаги расширения параметров к строковому или массивному литералу в zsh

Иногда мне хотелось бы применить флаги расширения параметров к строке или массиву литералов в zsh. В качестве примера использования, скажем, я хочу разделить некоторую строку, разделенную запятыми, $arglistна запятые, но добавить что-то в начало. Было бы неплохо иметь возможность сделать это:

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

Конечно, есть и другие способы решения этой конкретной проблемы, и я знаю, что всегда могу сначала присвоить параметру, а затем применить флаги. Но вопрос в том: могу ли я как-то применить флаги непосредственно к литералу?

решение1

Я думаю, вы ищете :-замену параметров:

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

Из 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.

На самом деле этот пример можно сделать немного короче:

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

Связанный контент