Гибкая векторная конструкция в tcsh
Генерация вектора - это метод, который позволяет нам генерировать списки без определения итераторов и циклов записи. Они полезны во многих ситуациях и могут сделать код более кратким и компактным. Они также способствуют быстрому составлению более сложных конструкций с помощью command expansion,
Вот пример: у меня есть программа, которая работает с несколькими аргументами хоста. Мне нужно создать список имен хостов, в которые встроен порядковый номер, например:
a1z a2z a3z a4z a5z
В bash можно написать:
$ progname a{1..5}z
который будет расширяться до:
$ progname a1z a2z a3z a4z a5z
В tcsh, которой не хватает этой полезной функции генерации вектора аргумента, мы можем иногда использовать seq, К несчастью, seq ограничено только номерами. man seq Говорит, что seq поддерживает --format аргумент, но это, кажется, не делает действительно полезную вещь (допускает произвольные форматы, включая число). Вместо этого он поддерживает только изменение формата числа с плавающей запятой одного числа (очень жаль).
Конечно, мы можем делегировать расширение bash + echo используя оба command expansion и цитирование полного bash -c аргумент:
tcsh> progname `bash -c "echo a{1..5}z"`
Точно так же мы могли бы делегировать генерацию строкового вектора большим утилитам, таким как awk, perl, python, lisp, или же R используя `` (расширение команды).
Вопрос: есть ли другие простые способы генерировать такие векторы в tcsh, Под "простым" я подразумеваю небольшую утилиту, например seqили, что еще лучше, встроенную конструкцию оболочки, не прибегая к написанию циклов или делегированию генерации вектора для "больших" программ, таких как bash/awk/clisp/perl/python/R?
1 ответ
Вы можете передать вывод seq,
progname `seq 5 | sed -e 's/^/a/' -e 's/$/z/'`
Вы можете использовать подстановку истории, чтобы добавить префикс ко всем элементам массива:
set a = (`seq 5`)
progname ${a:s//a/}
Я не знаю, как добавить суффикс, но я не эксперт по tcsh.
Tcsh в некотором роде умер в этом столетии, и даже раньше он был признан менее подходящим для написания сценариев, чем оболочки в стиле Борна. Как насчет использования Zsh?
a=($(seq 5))
progname a${^a}z