使用 Bash 大括号扩展来乘以变量范围

发布于 2024-11-01 18:38:11 字数 1120 浏览 3 评论 0原文

我有一个扩展代码的问题 这个问题:你能在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

傾城如夢未必闌珊 2024-11-08 18:38:11

这似乎有效,只是转义了 $[] 来延迟它们的评估(以便它们被回显,然后评估)

eval echo \$\[{1..$boundary}*{1..$boundary}\]

这就是说我现在需要去查找什么< 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)

eval echo \$\[{1..$boundary}*{1..$boundary}\]

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}\\\)\\\)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文