单个变量中的多个序列

单个变量中的多个序列

我有两个类型范围,我需要将其放入单个变量中。我怎样才能做到这一点?

例如:我有一个范围,如 bs0401 到 bs0405 (bs0401,bs0402,bs0403...) 和另一个范围,如 bn0201 到 bn0205(bn0201,bn0202,bn0203..),我需要在一个变量下进行这两种扩展。

我可以对单个序列做类似的事情

h=$(seq -f "bs%02g" 0401 1 0405) 

但不确定如何包含在单个变量中分配的多个序列,以便 echo $h 给出像

bs0401
bs0402
bs0403
bs0404
bs0405
bn0201
bn0202
bn0203
bn0204
bn0205

答案1

您可以在命令替换 ( $(...)) 中包含多个命令。所以在你的情况下

h=$(seq -f 'bs%04g' 0401 1 0405; seq -f 'bn%04g' 0201 1 0205)

给你

$ echo $h
bs0401 bs0402 bs0403 bs0404 bs0405 bn0201 bn0202 bn0203 bn0204 bn0205

答案2

如果您想在一个变量中存储多个值,您需要一个支持数组的 shell,例如csh, ksh, rc, zsh, bash, fish, yash

zsh,中bashyash -o braceexpand您可以在不依赖命令的情况下seq使用以下命令来完成此操作:

list=(bs{0401..0405} bn{0201..0205})

或者在ksh93

list=(bs{401..405%04d} bn{201..205%04d})

尽管在这种特殊情况下,您可以将其缩短为:

list=({bs04,bn02}0{1..5})

这适用于所有 4 个 shell。

和:

string=$(seq -f bs%04g 401 405)

你实际上正在存储到$string seqvalue 是删除了尾随换行符的命令的输出。

您可以使用以下命令存储两个命令的串联输出seq

string=$(seq -f bs%04g 401 405; seq -f bn%04g 201 205)

或者:

string="$(seq -f bs%04g 401 405)
$(seq -f bn%04g 201 205)"

这里在它们之间添加回一个换行符,以补偿第一个命令替换删除的换行符。

相关内容