繁体   English   中英

Bash for循环在列表中批量

[英]Bash for loop in batch on list

我正在尝试 bash 脚本,它根据列表的大小以批处理模式执行以下 java jar 命令。

我有一个包含美国 54 个州的字符串列表。

list = [USA+CA,USA+TX,USA+TN...]

我需要与具有 4 个值的 4 个实例并行执行以下命令作为列表的输入。

java -jar test-execute.jar --localities=USA+TX,USA+CA,USA+TN,USA+AB

等到任何实例的执行完成,然后启动具有接下来 4 个状态的 jar 的新实例。

array=( USA+TX,USA+CA,USA+TN,USA+AB )
for i in "${array[@]}"
do
    java -jar test-execute.jar --localities= ???
done

我无法理解如何动态地将数组中的输入提供给 jar 执行。

所以,

我有 54 码的清单,

我需要并行运行 4 个 Java 实例,每个实例具有 4 个唯一状态作为来自 54 个列表的输入。,一旦这些实例完成,然后开始下一个 4 个实例,每个实例有下一个唯一的 4 个状态。

更新:

我有 54 个州的列表,16 个核心机器。 每个 java jar 实例将使用 4 个内核,因此我可以一次运行 4 个 java 实例以使用 16 个内核的机器。

16 core machine 
   java instance-1 4 states
   java instance-2 4 states
   java instance-3 4 states
   java instance-4 4 states
 
wait till any of these instances complete, once completed, start new instance with next 4 states until all 54 states has been executed. 

请帮忙。

首先,必须将bash array分配为以空格分隔的列表,如下所示:

array=("USA+AL" "USA+AK" "USA+AZ" "USA+AR" "USA+AS" "USA+CA" ...)

那么请你尝试这样的事情:

array=("USA+AL" "USA+AK" "USA+AZ" "USA+AR" "USA+AS" "USA+CA" ...)
for (( i = 0; i < ${#array[@]}; i+=4 )); do
    echo java -jar test-execute.jar --localities="$(IFS=,; echo "${array[*]:i:4}")"
done
  • for循环具有类似 C 的语法,可将索引递增 4。
  • 数组切片${array[*]:i:4}将数组分成每四个元素的子数组,从第 i 个索引开始。 最后一个包含两个元素的块也被处理。
  • $(IFS=,; echo "${array[*]:i:4}")用逗号连接数组,作为参数提供给java

如果输出看起来不错,请将echo放在java前面。

[编辑]
至于并行性,我们可以使用xargs-P选项。 你能试试吗:

array=("USA+AL" "USA+AK" "USA+AZ" "USA+AR" "USA+AS" "USA+CA" ...)
for (( i = 0; i < ${#array[@]}; i+=4 )); do
    printf "%s\n" "$(IFS=,; echo "${array[*]:i:4}")"
done | xargs -P4 -L1 -I{} java -jar test-execute.jar --localities="{}"
  • 它将四种状态分组为一个参数。
  • -P4选项一次生成四个进程。
  • 然后一次处理总共16个状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM