[英]Compare 2 strings
我為Nagios編寫了此腳本,以檢查服務是否正在運行。 但是我需要它來比較2個字符串。 完整腳本如下。
elif [[ $PROCESS_RUNNING1 = "active" && $PROCESS_RUNNING2 = "(running)" || "(exited)" ]]; then
如果我通過shellcheck運行它,則說是錯誤的,因為||
。 但是,我將如何比較2個字符串,這真的是最有效的方法嗎? 可以縮短嗎?
elif [[ $PROCESS_RUNNING1 = "active" && $PROCESS_RUNNING2 = "(running)" || $PROCESS_RUNNING2 = "(exited)" ]]; then
其他所有技巧都非常受歡迎,我仍然是初學者!
#!/bin/bash
while true
do
case $1 in
-s|--service)
DAEMON=$2
shift; shift
;;
-*)
echo "Unknown option: $1"
echo "Usage: -s or --service <daemon name>"
exit 1
;;
*)
break
;;
esac
done
PROCESS_STATUS=$(systemctl status "$DAEMON" | awk 'FNR==3')
PROCESS_RUNNING1=$(systemctl status "$DAEMON" | awk 'FNR==3' | awk '{print $2}')
PROCESS_RUNNING2=$(systemctl status "$DAEMON" | awk 'FNR==3' | awk '{print $3}')
if [[ $(pgrep -f "$DAEMON" | wc -l) -eq 0 ]]; then
echo "$DAEMON PID not found"
exit 1
elif [[ $PROCESS_RUNNING1 != "active" ]]; then
echo "$PROCESS_STATUS"
echo "is not active"
exit 2
elif [[ $PROCESS_RUNNING2 != "(running)" || "(exited)" ]]; then
echo "$PROCESS_STATUS"
echo "is not running or exited"
exit 2
elif [[ $PROCESS_RUNNING1 = "active" && $PROCESS_RUNNING2 = "(running)" || "(exited)" ]]; then
echo "$PROCESS_STATUS"
exit 0
else echo "$DAEMON status unknown, please check"
exit 3
fi
撲
$PROCESS_RUNNING2 = "(running)" || "(exited)"
大約和
"(exited)" || $PROCESS_RUNNING2 = "(running)"
無論如何,它的評估結果都是正確的 。
當您只在[[ ... ]]
編寫一個字符串而不使用=
類的任何運算符時,則該字符串對於非空字符串將解釋為true,對於空字符串將解釋為false 。
你可能是說
[[ "$PROCESS_RUNNING1" = "active" && "$PROCESS_RUNNING2" = "(running)"
|| "$PROCESS_RUNNING2" = "(exited)" ]]
甚至更有可能是帶括號的版本
[[ "$PROCESS_RUNNING1" = "active" &&
("$PROCESS_RUNNING2" = "(running)" || "$PROCESS_RUNNING2" = "(exited)") ]]
這樣可以確保始終保持第一個條件。
PROCESS_STATUS=$(systemctl status "$DAEMON" | awk 'FNR==3')
PROCESS_RUNNING1=$(systemctl status "$DAEMON" | awk 'FNR==3' | awk '{print $2}')
PROCESS_RUNNING2=$(systemctl status "$DAEMON" | awk 'FNR==3' | awk '{print $3}')
可以更有效地編寫為
PROCESS_STATUS=$(systemctl status "$DAEMON" | awk 'FNR==3')
PROCESS_RUNNING1=$(awk '{print $2}' <<< "$PROCESS_STATUS")
PROCESS_RUNNING2=$(awk '{print $3}' <<< "$PROCESS_STATUS")
代替
if [[ $(pgrep -f "$DAEMON" | wc -l) -eq 0 ]]; then
寫
if ! pgrep -f "$DAEMON"; then
支票
[[ $PROCESS_RUNNING2 != "(running)" || "(exited)" ]]
永遠是真的 。 即使你的意思
[[ $PROCESS_RUNNING2 != "(running)" || $PROCESS_RUNNING2 != "(exited)" ]]
為了評估為false , $PROCESS_RUNNING2
必須同時具有值"(running)"
和("exited")
。
環境和內置變量用ALLCAPS編寫。 在camelCase中編寫您自己的變量,以避免名稱沖突。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.