[英]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.