我有兩個陣列,其中的數字已經存盤在變數中:
$SLOT_IDS = [1,2,3,4,5]
$PR_IDS = [3,4]
我想找出陣列 1 中的數字而不是陣列 2 中的數字。所以在這種情況下,它將是
$OBSOLETE_SLOT_IDS = [1,2,5]
然后我想為這些數字運行一個命令并將其插入占位符:
所以這個命令:
az webapp deployment slot delete -g group --name webapp --slot pr-<PLACEHOLDER>
應該運行三遍:
az webapp deployment slot delete -g group --name webapp --slot pr-1
az webapp deployment slot delete -g group --name webapp --slot pr-2
az webapp deployment slot delete -g group --name webapp --slot pr-5
我知道它應該看起來像這樣(要求它是行內的):
for i in $OBSOLETE_SLOT_IDS; do az webapp deployment slot delete -g group --name webapp --slot pr-$i; done
所以我的問題:
- 如何使用行內命令從其他兩個變數中計算 $OBSOLETE_SLOT_IDS
- for回圈的正確版本是什么
評論:似乎變數不包含實際的陣列。它們基本上是我存盤在變數中的一些 curl 呼叫的回傳值:

uj5u.com熱心網友回復:
一種更短的方法,用于jq獲取兩個陣列的差異:
#!/usr/bin/env bash
slot_ids="[1,2,3,4,5]"
pr_ids="[3,4]"
while read -r id; do
az webapp deployment slot delete -g group --name webapp --slot "pr-$id"
done < <(jq -n --argjson a "$slot_ids" --argjson b "$pr_ids" '$a - $b | .[]')
uj5u.com熱心網友回復:
jq -r '.[]'會將您的陣列轉換為每行一個數字的流——這是標準 UNIX 工具期望使用的格式。
一旦我們得到排序形式的數字,我們就可以comm用來比較兩個流。-3告訴comm忽略兩個流中存在的內容,并-2告訴它忽略僅存在于第二個流中的內容,因此comm -23僅列印第一個流中唯一的檔案。
然后使用readarray(在 bash 4.0 中添加)讓我們將該內容讀入一個陣列,我們可以在for回圈中對其進行迭代。
#!/usr/bin/env bash
slot_ids='[1,2,3,4,5]'
pr_ids='[3,4]'
readarray -t filtered_slot_ids <(
comm -23 \
<(jq -r '.[]' <<<"$slot_ids" | sort) \
<(jq -r '.[]' <<<"$pr_ids" | sort))
for i in "${filtered_slot_ids[@]}"; do
az webapp deployment slot delete -g group --name webapp --slot "pr-$i"
done
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/493721.html
上一篇:如何將bash腳本陳述句合二為一
