【问题标题】:Unix bash. Loop over pairs of incremental integers [duplicate]Unix 重击。循环增量整数对[重复]
【发布时间】:2019-11-09 23:16:24
【问题描述】:

我有一个程序 GG,它需要两个整数作为参数 x 和 y 作为输入的参数,这样:

./GG -x 0 -y 100

我需要在连续的开始/结束整数对上运行 GG,就像这里每一行中的对:

x y
0 100
100 200
200 300
... ...
10000 10100

我得到的最接近的是这样的:

for i in {0..10000}; do for j in {100..10100}; do ./GG -x ${i} -y ${j}; done; done

但这会将每个 j 值循环到每个 i 值上,这不是我需要的。

非常欢迎任何建议!

【问题讨论】:

标签: bash loops


【解决方案1】:

无需遍历两个值。循环一个,但添加你的偏移量来获得另一个。

for ((i=0; i<=10000; i+=100)); do
  ./GG -x "$i" -y "$(( i + 100 ))"
done

https://ideone.com/r3qBZU查看此运行

请参阅 the C-style for looparithmetic expression 语法。

【讨论】:

  • 非常感谢@Charles Duffy!。我知道这是一个不同的问题,但是您是否偶然知道如何使用并行化在每对值上运行 GG 而不是等到每个循环完成?
  • for ((i=0; i&lt;=10000; i+=100)); do printf '%s\0' "$i"; done | xargs -0 -P 8 -n 8 sh -c 'for arg; do ./GG -x "$arg" -y "$((arg + 100))"; done' _ 是一种方法。顺便说一句,如果您搜索它,它已经在知识库中。
  • -P 8 是一次运行的进程数,-n 8 是每个进程实例在使用不同的数字组重新启动之前要处理的项目数;调整以适合您的硬件、开销容差等)。
  • 嗨@Charles Duffy,我的最后一个问题,抱歉。真正的 GG 程序有几个参数:GG -h -l -k -int。参数 -int 使用两个整数,就像我提到的那样(例如 GG -h -l -k -int 0 100; GG -h -l -k -int 100 200; 等等)。我不确定这个调整后的脚本是否正确: for ((i=0; i
  • @Lucas,乍一看,它看起来对我来说是正确的。也就是说,将其从 sh -c 更改为 sh -x -c,它会打印它实际​​运行的命令的日志,以便您进行比较。
猜你喜欢
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 2019-09-14
  • 2021-07-27
  • 2016-05-02
  • 1970-01-01
相关资源
最近更新 更多