向量生成是一种技术,它允许我们生成列表而无需定义迭代器和编写循环。它们在许多情况下都很有用,并且可以使代码变得更加简洁和紧凑。它们还有助于通过快速组合更复杂的结构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
,或者更好的是,内置的 shell 构造,而无需诉诸编写循环或将向量生成委托给 这样的“大型”程序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 在本世纪已经消亡了,甚至在此之前就被广泛认为不如 Bourne 风格的 shell 适合编写脚本。那么使用 zsh 怎么样?
a=($(seq 5))
progname a${^a}z