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

Tyi*_*ilo 50 bash seq

有可能做这样的事情:

start=1
end=10
echo {$start..$end}
# Ouput: {1..10}
# Expected: 1 2 3 ... 10 (echo {1..10})
Run Code Online (Sandbox Code Playgroud)

anu*_*ava 55

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

相反,使用算术for循环:

start=1
end=10
for ((i=start; i<=end; i++))
do
   echo "i: $i"
done
Run Code Online (Sandbox Code Playgroud)

OUTPUT

i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
i: 10
Run Code Online (Sandbox Code Playgroud)


cni*_*tar 24

你应该考虑使用seq(1).你也可以使用eval:

eval echo {$start..$end}
Run Code Online (Sandbox Code Playgroud)

这是 seq

seq -s' ' $start $end
Run Code Online (Sandbox Code Playgroud)

  • 而且seq也被弃用了 (7认同)
  • @Tyilo你在使用什么shell/OS?的Solaris?我从未见过seq在任何Linux发行版上都没有出现过.事实上,它甚至在GNU coreutils中:http://www.gnu.org/s/coreutils/manual/html_node/seq-invocation.html (3认同)
  • @opsguy coreutils!= POSIX标准.当然,它存在于Linux中,但世界上有更多的操作系统. (2认同)
  • 使用`eval`在这里和大多数其他地方一样可怕,不习惯它或者你会发现自己有一天会留下命令注入漏洞 (2认同)

bmk*_*bmk 10

你必须使用eval:

eval echo {$start..$end}
Run Code Online (Sandbox Code Playgroud)

  • 这就像用手提钻敲钉子一样.这很危险(从字面上看,如果你的任何值来自不受信任的输入,会引入潜在的shell注入漏洞),而不是正确的工具.`for((i = start; i <end; i ++)); 做......; done`. (8认同)

gle*_*man 8

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

for (( i=start; i<=end; i++ )); do printf "%d " $i; done; echo ""
Run Code Online (Sandbox Code Playgroud)