使用 Bash 大括号扩展来乘以变量范围
我有一个扩展代码的问题 这个问题:你能在 Bash 中使用大括号扩展(而不是 seq
)而不使用循环来乘以两个变量范围吗?
这是我到目前为止所尝试的
弄清楚变量边界范围是如何工作的(最后,充分利用eval
):
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
$ boundary=10
$ echo {1..$boundary}
{1..10}
$ eval echo {1..$boundary}
1 2 3 4 5 6 7 8 9 10
但是如何将两个变量边界范围相乘呢?
$ echo $(({1..10}*{1..10}))
1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100
$ boundary=10
$ echo $(({1..$boundary}*{1..$boundary}))
bash: {1..10}*{1..10}: syntax error: operand expected (error token is "{1..10}*{1..10}")
$ eval echo $(({1..$boundary}*{1..$boundary}))
bash: {1..10}*{1..10}: syntax error: operand expected (error token is "{1..10}*{1..10}")
I've a question extending the code in this question: Can you multiply two variable ranges in Bash using brace expansion (not seq
) and not using loops?
This is what I've tried so far
Work out how variable boundary ranges work (finally, a good use of eval
):
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
$ boundary=10
$ echo {1..$boundary}
{1..10}
$ eval echo {1..$boundary}
1 2 3 4 5 6 7 8 9 10
But how can you multiply two variable boundary ranges?
$ echo $(({1..10}*{1..10}))
1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100
$ boundary=10
$ echo $(({1..$boundary}*{1..$boundary}))
bash: {1..10}*{1..10}: syntax error: operand expected (error token is "{1..10}*{1..10}")
$ eval echo $(({1..$boundary}*{1..$boundary}))
bash: {1..10}*{1..10}: syntax error: operand expected (error token is "{1..10}*{1..10}")
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这似乎有效,只是转义了
$
和[]
来延迟它们的评估(以便它们被回显,然后评估)这就是说我现在需要去查找什么< code>$[] 是 ;-)
第二个答案,使用未弃用的
$[]
语法(但有两个 eval)eval eval echo "\$\(\("{ 1..$boundary}*{1..$boundary}"\)\)"
或
eval eval echo \\\$\\\(\\\({1..$boundary} *{1..$boundary}\\\)\\\)
this seems to work, just escaped the
$
and[]
to delay their evaluation (so that they are echoed, then evaluated)That said I now need to go lookup what
$[]
does ;-)Second answer, with non deprecated
$[]
syntax (but two evals)eval eval echo "\$\(\("{1..$boundary}*{1..$boundary}"\)\)"
or
eval eval echo \\\$\\\(\\\({1..$boundary}*{1..$boundary}\\\)\\\)