Bash
set -e
和 grep
習慣用法,用於防止在找不到模式時過早退出 shell 腳本
需要幫助 - 在 GNU/LINUX bash 上的 shell 腳本上下文中:
我總是用
set -e
. 通常,我希望grep
並且不總是希望腳本在具有指示未找到模式grep
的退出狀態時終止執行。1
我試圖解決這個問題的方法如下:
(嘗試我)
如果
set +o pipefail
並使用類似的東西呼叫 grep,grep 'p' | wc -l
我會得到所需的行為,直到未來的維護者啟用pipefail
. 另外,我喜歡啟用pipefail
,所以這對我不起作用。(嘗試二)
使用
sed
orawk
且僅列印匹配模式的行,然後wc
匹配行來測試匹配模式。我不喜歡這個選項,因為使用sed
togrep
似乎是解決我真正問題的方法。(嘗試 III)
這個是我最不喜歡的——比如:
set +e; grep 'p'; set-e
任何見解/成語將不勝感激 - 謝謝。
您可以將 grep 置於
if
條件中,或者如果您不關心退出狀態,請添加|| true
.範例:
grep
殺死外殼$ bash $ set -e $ echo $$ 33913 $ grep foo /etc/motd $ echo $$ 9233
解決方案1:丟棄非零退出狀態
$ bash $ set -e $ echo $$ 34074 $ grep foo /etc/motd || true $ echo $$ 34074
解決方案2:顯式測試退出狀態
$ if ! grep foo /etc/motd; then echo not found; fi not found $ echo $$ 34074
從 bash 手冊頁討論
set -e
:如果失敗的命令是緊跟在while或until 關鍵字之後的命令列表的一部分、if或elif保留字之後的測試的一部分、在****&&或││列表中執行的任何命令的一部分 ,則 shell 不會退出在最後一個**&&或││之後的命令,管道中除最後一個之外的任何命令,或者如果命令的返回值正在與!** .