bash seq 替换 ({1..10}) 中的变量 [duplicate]

Variables in bash seq replacement ({1..10}) [duplicate]

提问人:Tyilo 提问时间:6/1/2011 更新时间:9/29/2017 访问量:106308

问:

是否可以做这样的事情:

start=1
end=10
echo {$start..$end}
# Ouput: {1..10}
# Expected: 1 2 3 ... 10 (echo {1..10})
bash 序列

评论


答:

10赞 bmk 6/1/2011 #1

您必须使用:eval

eval echo {$start..$end}

评论

9赞 Charles Duffy 9/27/2013
这就像用手提钻敲钉子一样。这很危险(从字面上看,如果您的任何值来自不受信任的输入,则会引入潜在的 shell 注入漏洞),并且不是适合这项工作的工具。.for ((i=start; i<end; i++)); do ...; done
29赞 cnicutar 6/1/2011 #2

您应该考虑使用 .您还可以使用 eval:seq(1)

eval echo {$start..$end}

这里是seq

seq -s' ' $start $end

评论

8赞 Tyilo 6/1/2011
无论如何,seq 也被弃用了
3赞 opsguy 6/1/2011
@Tyilo 你使用什么 shell/OS?索拉里斯?我从未见过 seq 不存在于任何 Linux 发行版上。事实上,它甚至在 GNU coreutils 中也是如此:gnu.org/s/coreutils/manual/html_node/seq-invocation.html
3赞 Charles Duffy 9/27/2013
@opsguy coreutils != POSIX 标准。当然,它在 Linux 中就存在,但世界上还有更多的操作系统。
1赞 matt b 1/13/2017
就其价值而言,“已弃用”与“不可取”的含义不同
3赞 ilkkachu 5/16/2017
在这里使用和大多数其他地方一样可怕,不要习惯它,否则你总有一天会发现自己离开了命令注入漏洞eval
2赞 opsguy 6/1/2011 #3

我通常只是这样做:

echo `seq $start $end`

评论

0赞 Tyilo 6/1/2011
看看我对 cnicutar 回答的评论
0赞 Charles Duffy 9/27/2013
seq是一个非标准工具(从字面上看,POSIX中没有指定)。
2赞 ilkkachu 5/16/2017
更不用说这是非标准的事实,但回声+命令替换只是一个愚蠢的组合。seq
0赞 Bruno Bronosky 1/30/2019
@ilkkachu,如果需要添加换行符,则不需要。
1赞 ilkkachu 1/30/2019
@BrunoBronosky,更大的区别是未加引号的命令替换将空格折叠为单个空格(除非从默认值更改)。因此,您可以获得所有在同一行上的数字,而不是像默认的 .但如果你想要,你可以直接使用 .另一方面,如果您确实引用了命令替换,则具有完全相同的输出。命令替换去掉尾随换行符(有一个换行符),然后重新添加一个换行符。IFSseqseq -w ' ' 1 10echo "$(seq 1 10)"seq 1 10echo
72赞 anubhava 6/1/2011 #4

在 bash 中,大括号扩展发生在变量扩展之前,因此这不可能直接实现。

相反,请使用算术循环:for

start=1
end=10
for ((i=start; i<=end; i++))
do
   echo "i: $i"
done

输出

i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
i: 10

评论

1赞 philcolbourn 3/8/2014
输出应该是 1 2 3 4 5 6 7 8 9 10?
0赞 syss 3/20/2018
这是可能的,但它有点丑陋,因为在大括号扩展之前,人们会启动另一个 shell 来执行变量扩展:start=1;end=10;for i in $(bash -c "echo {$start..$end}");do echo $i;done
9赞 glenn jackman 6/1/2011 #5

如果你没有 ,你可能想坚持使用普通的 for 循环seq

for (( i=start; i<=end; i++ )); do printf "%d " $i; done; echo ""

评论

0赞 WestCoastProjects 3/2/2021
这是唯一有效的非可怕(即不是评估)答案。不知道 bash 有 c 样式循环
2赞 Spencer Rathbun 6/1/2011 #6

你肯定它是 BASH 吗?ZSH 以您想要的方式处理此问题。这在 BASH 中不起作用,因为大括号扩展发生在任何其他扩展类型(如变量扩展)之前。因此,您将需要使用替代方法。

您需要将大括号和变量扩展结合起来有什么特殊原因吗?也许解决您的问题的不同方法可以消除对此的需求。

1赞 lantian0811 8/27/2017 #7

使用 -s 前任: seq -s ' ' 1 10 输出: 1 2 3 4 5 6 7 8 9 10