Bash

set -egrep 習慣用法,用於防止在找不到模式時過早退出 shell 腳本

  • June 10, 2020

需要幫助 - 在 GNU/LINUX bash 上的 shell 腳本上下文中:

我總是用set -e. 通常,我希望grep並且不總是希望腳本在具有指示未找到模式grep的退出狀態時終止執行。1

我試圖解決這個問題的方法如下:

(嘗試我)

如果set +o pipefail並使用類似的東西呼叫 grep,grep 'p' | wc -l我會得到所需的行為,直到未來的維護者啟用pipefail. 另外,我喜歡啟用pipefail,所以這對我不起作用。

(嘗試二)

使用sedorawk且僅列印匹配模式的行,然後wc匹配行來測試匹配模式。我不喜歡這個選項,因為使用sedtogrep似乎是解決我真正問題的方法。

(嘗試 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

如果失敗的命令是緊跟在whileuntil 關鍵字之後的命令列表的一部分、ifelif保留字之後的測試的一部分、在****&&││列表中執行的任何命令的一部分 ,則 shell 不會退出在最後一個**&&││之後的命令,管道中除最後一個之外的任何命令,或者如果命令的返回值正在與!** .

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