Bash

如何同時使用 bash 的 if test 和 find 命令?

  • December 28, 2021

我有一個包含崩潰日誌的目錄,我想在基於 find 命令的 bash 腳本中使用條件語句。

日誌文件以這種格式儲存:

/var/log/crashes/app-2012-08-28.log
/var/log/crashes/otherapp-2012-08-28.log

我希望 if 語句僅在過去 5 分鐘內修改了特定應用程序的崩潰日誌時才返回 true。我會使用的find命令是:

find /var/log/crashes -name app-\*\.log -mmin -5

我不確定如何if正確地將其合併到語句中。我認為這可能有效:

if [ test `find /var/log/crashes -name app-\*\.log -mmin -5` ] then
service myapp restart
fi

有幾個地方我不清楚:

  • 我查看了if 標誌,但我不確定應該使用哪一個(如果有的話)。
  • 我是否需要該test指令,還是應該直接針對 find 命令的結果進行處理,或者使用它find... | wc -l來獲取行數?
  • 不是 100% 需要回答這個問題,而是test針對命令返回的返回程式碼進行測試?而且它們在 / 之外是不可見的 - 在stdout/之外stderr?我閱讀了該man頁面,但我仍然不清楚何時使用test以及如何調試它。

[test是同義詞(除了[requires ]),所以你不想使用[ test

[ -x /bin/cat ] && echo 'cat is executable'
test -x /bin/cat && echo 'cat is executable'

test如果條件為真,則返回零退出狀態,否則返回非零。這實際上可以被任何程序替換以檢查其退出狀態,其中 0 表示成功,非零表示失敗:

# echoes "command succeeded" because echo rarely fails
if /bin/echo hi; then echo 'command succeeded'; else echo 'command failed'; fi

# echoes "command failed" because rmdir requires an argument
if /bin/rmdir; then echo 'command succeeded'; else echo 'command failed'; fi

但是,以上所有範例都僅針對程序的退出狀態進行測試,而忽略了程序的輸出。

對於find,您將需要測試是否生成了任何輸出。-n測試非空字元串:

if [[ -n $(find /var/log/crashes -name "app-*.log" -mmin -5) ]]
then
   service myapp restart
fi

help test可以通過在命令行呼叫來獲得完整的測試參數列表bash

如果您正在使用bash(而不是sh),則可以使用[[ condition ]],當您的條件中有空格或其他特殊情況時,它的行為更可預測。否則它通常與使用相同[ condition ]。我[[ condition ]]在這個例子中使用過,我盡可能這樣做。

我也更改command$(command),它的行為通常也類似,但使用嵌套命令更好。

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