我有以下代碼: -
test -z "$(echo ${JIRA_DETAIL} | jq '.fields.status.name' | sed -r "s/\"(Done|Completed|Closed)\"//")" && echo "Found valid Jira" || echo "Not a valid Jira (Closed/Completed/Done)"
該代碼有效。當狀態是其中之一(完成、完成或關閉)時,它會列印"Found valid Jira"。我想要它的"Not In"條件,即每當狀態出現時,它應該說“找到有效的 Jira”。
我得到的 Jira 詳細回復如下:-
{
"expand":"renderedFields,names,schema,operations,editmeta,changelog,versionedRepresentations",
"id":"10000",
"self":"https://mycloudbox.atlassian.net/rest/api/2/issue/10000",
"key":"MYC-1",
"fields":{
"status":{
"self":"https://mycloudbox.atlassian.net/rest/api/2/status/3",
"description":"This issue is being actively worked on at the moment by the assignee.",
"iconUrl":"https://mycloudbox.atlassian.net/images/icons/statuses/inprogress.png",
"name":"In Progress",
"id":"3",
"statusCategory":{
"self":"https://mycloudbox.atlassian.net/rest/api/2/statuscategory/4",
"id":4,
"key":"indeterminate",
"colorName":"yellow",
"name":"In Progress"
}
}
}
}
我嘗試過使用檔案,但它令人困惑。我不擅長正則運算式,因此檢查。如何在此設定 ^ 或 Not In 條件?
[使用 Linux If-Else 更新有缺陷的代碼] 它每次都在 else 條件下運行并列印Valid JIRA Id found!. 請建議,因為我只想嘗試使用 Linux If-Else,謝謝
- |
if [[ "$JIRA_STATUS" == "^(Done|Completed|Closed)$" ]]
then
echo "Invalid JIRA (Done/Completed/Closed) found!"
exit 1
else echo "Valid JIRA Id found!"
fi
uj5u.com熱心網友回復:
if (.fields.status.name | IN("done", "completed", "closed"))
then "Found valid Jira"
else "Found INVALID Jira"
end
Found valid Jira如果在.field.status.name傳遞給的引數之一中找到 ,將輸出IN(),否則,列印Found INVALID Jira
JqPlay 演示
注意IN()區分大小寫,用于ascii_downcase將名稱轉換為小寫,以簡化大小寫:
if (.fields.status.name | ascii_downcase | IN("done", "completed", "closed"))
then "Found valid Jira"
else "Found INVALID Jira"
end
uj5u.com熱心網友回復:
為什么不直接用 jq 做這個?
if .fields.status.name | IN("Done","Completed","Closed")
then "Found valid Jira"
else "Not a valid Jira (Closed/Completed/Done)"
end
完整示例:
printf '%s' "$JIRA_DETAIL" | jq -r 'if .fields.status.name | IN("Done","Completed","Closed")
then "Found valid Jira"
else "Not a valid Jira (Closed/Completed/Done)"
end'
或者更短,但更晦澀:
(.fields.status.name | select(IN("Done","Completed","Closed")) | "Found valid Jira")
// "Not a valid Jira (Closed/Completed/Done)"
{
true: "Found valid Jira",
false: "Not a valid Jira (Closed/Completed/Done)"
}[.fields.status.name | IN("Done","Completed","Closed") | tostring]
另一種選擇是從您的狀態名稱到輸出的映射(更靈活,但對于這種簡單的情況,它使用了很多重復):
{
Done: "Found valid Jira",
Completed: "Found valid Jira",
Closed: "Found valid Jira"
}[.fields.status.name] // "Not a valid Jira (Closed/Completed/Done)"
uj5u.com熱心網友回復:
由于 OP 不想在這里jq使用 GNUawk解決方案。使用您顯示的示例,請嘗試遵循 GNUawk代碼。用 GNU 撰寫和測驗awk。
awk -v RS='\n[[:space:]] "status":{([^\n]*\n[[:space:]] )*"name":[^,]*,' '
RT{
split(RT,arr,"\"name\":")
gsub(/"|,$/,"",arr[2])
value=arr[2]
if(value=="Done" || value=="Completed" || value=="Closed"){ exit }
else{ print "Valid JIRA Id found!" }
}
' Input_file
uj5u.com熱心網友回復:
這是第二個答案,因為問題發生了 180° 大轉彎。我仍然會留下我的第一個答案,以防有人正在尋找最初問題的解決方案。
如果您只想反轉if陳述句的“真”和“假”分支,只需交換分支或否定條件:
if condition; then
: true branch (1)
else
: false branch (2)
fi
成為
if condition; then
: false branch (2) # swapped with (1)
else
: true branch (1) # swapped with (2)
fi
或者
if ! condition; then
: false branch (2)
else
: true branch (1)
fi
但最重要的問題是您對正則運算式的使用。==是字串比較運算子,與正則運算式不匹配。所以你的條件總是假的(除非JIRA_STATUS實際定義/分配為JIRA_STATUS='^(Done|Completed|Closed$)')。
因此,您必須更改運算子以匹配正則運算式,即使用=~,然后使用正則運算式而不是字串,即^(…)$不"^(…)$"(未參考!):
if ! [[ "$JIRA_STATUS" =~ ^(Done|Completed|Closed)\$ ]]; then
echo "Invalid JIRA (Done/Completed/Closed) found!"
exit 1
else
echo "Valid JIRA Id found!"
fi
在不否定結果的情況下,可以切換分支:
if [[ "$JIRA_STATUS" =~ ^(Done|Completed|Closed)\$ ]]; then
echo "Valid JIRA Id found!"
else
echo "Invalid JIRA (Done/Completed/Closed) found!"
exit 1
fi
必須在正則運算式匹配運算子的 LHS 上轉義某些字符很煩人,因此您可以提取一個變數,然后在 LHS 上不帶引號展開該變數:
valid_statuses='^(Done|Completed|Closed)$'
if [[ "$JIRA_STATUS" =~ $valid_statuses ]]; then
echo "Valid JIRA Id found!"
else
echo "Invalid JIRA (Done/Completed/Closed) found!"
exit 1
fi
但是由于您要與固定字串進行比較,所以我想建議一個使用case陳述句的更簡單的解決方案,它更易于撰寫和閱讀,而且它與 POSIX 兼容(即可以在其他 shell 中使用,而不僅僅是 bash):
case "$JIRA_STATUS" in
Done|Completed|Closed) echo 'Valid JIRA ID found!' ;;
*) echo 'Invalid JIRA (Done/Completed/Closed) found!'
exit 1
;;
esac
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/516466.html
標籤:linuxsed
