tcsh 中灵活的向量构建

tcsh 中灵活的向量构建

向量生成是一种技术,它允许我们生成列表而无需定义迭代器和编写循环。它们在许多情况下都很有用,并且可以使代码变得更加简洁和紧凑。它们还有助于通过快速组合更复杂的结构command expansion

以下是示例:我有一个对多个主机参数进行操作的程序。我需要生成一个主机名列表,其中包含嵌入的序列号,例如:

a1z a2z a3z a4z a5z

可以bash这样写:

$ progname a{1..5}z

它将扩展为:

$ progname a1z a2z a3z a4z a5z

在 中tcsh,缺少这个有用的参数向量生成功能,我们有时可以使用seq。不幸的是,seq仅限于数字。man seqseq支持--format参数,但它似乎并没有做真正有用的事情(允许包括数字在内的任意格式)。相反,它只支持更改数字的浮点格式(可惜)。

当然,我们可以使用两者并引用完整参数来将扩展委托给bash+ :echocommand expansionbash -c

tcsh> progname `bash -c "echo a{1..5}z"`

类似地,我们可以将字符串向量生成委托给大的实用程序,如awk、、、或使用“ (命令扩展)。perlpythonlispR

问题是:还有其他的吗?简单的在 中生成此类向量的方法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

相关内容