Bash
如何同時使用 bash 的 if test 和 find 命令?
我有一個包含崩潰日誌的目錄,我想在基於 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)
,它的行為通常也類似,但使用嵌套命令更好。