61

是否有可能做这样的事情:

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

7 回答 7

65

在 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
于 2011-05-31T17:42:50.777 回答
26

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

eval echo {$start..$end}

这是seq

seq -s' ' $start $end
于 2011-05-31T17:24:38.017 回答
9

如果你没有seq,你可能想坚持一个简单的 for 循环

for (( i=start; i<=end; i++ )); do printf "%d " $i; done; echo ""
于 2011-05-31T17:45:05.173 回答
9

你必须使用eval

eval echo {$start..$end}
于 2011-05-31T17:23:54.337 回答
2

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

您需要结合大括号和变量扩展的任何特殊原因?也许对您的问题采用不同的方法将消除对此的需要。

于 2011-05-31T17:56:56.937 回答
2

我通常只是这样做:

echo `seq $start $end`
于 2011-05-31T17:27:37.520 回答
0

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

于 2017-08-27T07:17:39.310 回答