簡體   English   中英

比較2個字符串

[英]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)") ]]

這樣可以確保始終保持第一個條件。

進一步改進

提示1

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")

提示2

代替

if [[ $(pgrep -f "$DAEMON" | wc -l) -eq 0 ]]; then

if ! pgrep -f "$DAEMON"; then

提示3

支票

[[ $PROCESS_RUNNING2 != "(running)" || "(exited)" ]]

永遠是真的 即使你的意思

[[ $PROCESS_RUNNING2 != "(running)" || $PROCESS_RUNNING2 != "(exited)" ]]

為了評估為false$PROCESS_RUNNING2必須同時具有值"(running)"("exited")

提示4

環境和內置變量用ALLCAPS編寫。 camelCase中編寫您自己的變量,以避免名稱沖突。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM