[英]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
选项一次生成四个进程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.