Linux

Bash Script Case 語句(if-not 邏輯)

  • March 9, 2019

我寫了一個小 bash 腳本。它將嘗試找到單詞ERROR。如果找到結果值將是非零數值(例如 25。我在腳本中提到但它是可變數值),如果未找到,它將是 0。

我的問題是:我想使用case語句,如果輸出不為零,則執行以下命令

truncate -s 0 /root/test/wayfile.log && screen -X -S wowow quit &

腳本在這裡:

#! /bin/bash

case "$(grep ERROR /root/test/wayfile.log | wc -w)" in

25)  echo "empty log file and kill screen: $(date)" >> /var/log/finderror.txt
   truncate -s 0 /root/test/wayfile.log && screen -X -S wowow quit &
;;
0)  # all ok
;;
esac

一種選擇:告訴case尋找 a 0,在這種情況下:什麼都不做;否則,執行你的命令:

case X in
 (0) : ## do nothing
     ;;
 (*) truncate ...
     ;;
esac

另一種選擇:告訴case尋找任何非零數字:

case X in 
 ([123456789]) truncate ...
esac

…但我不會嘗試將數字與 匹配case,而是使用test

if [ "$(grep -c ERROR /root/test/wayfile.log)" -gt 0 ]
then
 truncate ...
fi

我已經簡化grep ... | wc -w為 just grep -c,它要求grep進行計數而不是涉及wc

此外,由於您真的只是對文件中是否存在該單詞感興趣ERROR,因此您可以詢問grep它是否存在:

if grep -F -q ERROR /root/test/wayfile.log
then
  truncate ...
fi

-F標誌告訴 grep 我們的搜尋文本是純(“固定”)文本——沒有正則表達式;該-q標誌告訴 grep 是“安靜的”——不計算或輸出匹配的行,只需根據它是否找到搜尋文本(或沒有)設置其退出狀態。成功的退出程式碼(0)表示在文件中至少找到一次搜尋文本;failure 表示在文件中根本找不到搜尋文本。

引用自:https://unix.stackexchange.com/questions/505282