提问人:Tyilo 提问时间:6/1/2011 更新时间:9/29/2017 访问量:106308
bash seq 替换 ({1..10}) 中的变量 [duplicate]
Variables in bash seq replacement ({1..10}) [duplicate]
问:
是否可以做这样的事情:
start=1
end=10
echo {$start..$end}
# Ouput: {1..10}
# Expected: 1 2 3 ... 10 (echo {1..10})
答:
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,更大的区别是未加引号的命令替换将空格折叠为单个空格(除非从默认值更改)。因此,您可以获得所有在同一行上的数字,而不是像默认的 .但如果你想要,你可以直接使用 .另一方面,如果您确实引用了命令替换,则具有完全相同的输出。命令替换去掉尾随换行符(有一个换行符),然后重新添加一个换行符。IFS
seq
seq -w ' ' 1 10
echo "$(seq 1 10)"
seq 1 10
echo
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
上一个:在连续运行值中创建计数器
下一个:按顺序创建重复值的序列?
评论