我有两个类型范围,我需要将其放入单个变量中。我怎样才能做到这一点?
例如:我有一个范围,如 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
,中bash
,yash -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
一seq
value 是删除了尾随换行符的命令的输出。
您可以使用以下命令存储两个命令的串联输出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)"
这里在它们之间添加回一个换行符,以补偿第一个命令替换删除的换行符。