如何比較腳本中的兩個日期以檢查過期時間

如何比較腳本中的兩個日期以檢查過期時間

我正在創建一個腳本,可以在其中檢查某些內容是否過期,例如 kerberos 票證快取。

我需要取得過期日期/時間,取得當前日期/時間,然後比較它們以查看第一個日期/時間是否過期。

我正在創建一個腳本來查看 kerberos 票證是否仍然有效或已過期。

我可以以紀元格式取得兩者的到期日+時間(假設這是最好的)。

KRBEXPDATE=$(klist | grep -i krbtgt | awk '{print $3}')
KRBEXPTIME=$(klist | grep -i krbtgt | awk '{print $4}')
CURREPOCH=$(date +%s)
KRBEXPEPOCH=$(date --date="$KRBEXPDATE $KRBEXPTIME" +%s)

我想查看 if 語句中的 kerberos 票證是否已過期,我在處理時間的 if 語句的邏輯上遇到了問題。我可能已經在這裡回答了我自己的問題,但如果 CURRENTEPOCH 大於 KRBEXPEPOCH 則回顯「票證無效」。這樣有道理嗎?

if [[ "$CURREPOCH" > "$KRBEXPEPOCH" ]] ;
then
  echo "Ticket is not valid"
fi

答案1

比較當前日期和到期日期,將它們轉換為從紀元開始的秒數,是判斷您的機票是否過期的足夠好方法。只要您從同一台主機獲取CURREPOCHKRBEXPEPOCH,您就能夠準確地判斷票證的當前狀態(如果您不是從同一主機獲取它們,請注意,獲取的日期可能與不同的日期相關)時區,您需要相應地更改它們) 。

然而,正如卡米爾在他的評論中提到的,您在答案中使用的實現有一個關鍵問題:正如您在man bash第 1753 行中看到的,“>”運算符比較字串。對於您的應用程式來說,這通常是錯誤的做法。要了解原因,請嘗試以下操作:

if [[ "1000" > "200" ]]; then
  echo "Statement is true"
else
  echo "Statement is false"
fi

由於數字 1000 實際上大於 200,您可能會期望列印出「Statement is true」...但實際上您得到的是「Statement is false」。這是因為「>」的作用類似於 strcmp(),逐個字元比較字串上的 ASCII 代碼(例如,a < b為 true)。

您想要做的是使用“-gt”運算符,就像 Kamil 建議的那樣,或者使用 bash 的算術擴展(您可以根據第if270man bash行與 結合使用)來比較它們。假設您正確解析了 klist 指令的輸出,您可以執行下列任一操作:

if [[ "$CURREPOCH" -gt "$KRBEXPEPOCH" ]]; then echo "expired"; fi
if (( $CURREPOCH > $KRBEXPEPOCH )); then echo "expired"; fi

相關內容