Гибкая векторная конструкция в 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
Другие вопросы по тегам