Генерация вектора - это метод, который позволяет нам генерировать списки без определения итераторов и циклов записи. Они полезны во многих ситуациях и могут сделать код более кратким и компактным. Они также облегчают быстрое составление более сложных конструкций с помощью 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
?
Вы можете передать вывод 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