检查grep返回码

时间:2015-03-30 16:42:09

标签: bash unix grep exit-code

我的脚本包含以下设置:

set -o errexit
set -o pipefail
set -o nounset

现在我想在文件b中的字母A中使用o grep(不是sed,awk等),并将结果添加到文件c中:

grep A b >> C

问题是,如果在b文件中找不到A,grep将退出RC 1,在我的情况下这是好的,因为我不认为这是一个问题。 在那种情况下,我在函数中包装了grep命令并运行:

function func_1() {
  grep A b >> C
}

if func_1; then
  echo "OK"
else
  echo "STILL OK"
end

一切都很好,但很快我意识到抓住RC = 2(grep失败)会很好。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

我看不出它如何保护您免受set -e

的影响

我认为你需要一个能够在持续时间内禁用errexit的包装函数,例如:

function func_2 {
    set +o errexit
    func_1 "$@"
    rc=$?
    set -o errexit
    echo "$rc"
}

case $(func_2) in
    0) echo "success" ;;
    1) echo "not found" ;;
    2) echo "trouble in grep-land" ;; 
esac

仔细阅读set -e的文档,您可以在某些情况下处理具有非零退出状态的命令。但是,您的功能不能返回非零退出状态:

#!/bin/bash
set -o errexit

function mygrep {
    local rc=0
    # on the left side of ||, errexit not triggered
    grep "$@" >/dev/null || rc=$?
#     return $rc         # nope, will trigger errexit
    echo $rc
}

echo "test 1: exit status 0"
mygrep $USER /etc/passwd

echo "test 2: exit status 1"
mygrep foobarbaz /etc/passwd

echo "test 2: exit status 2"
mygrep $USER /file_does_not_exist

echo done

输出

test 1: exit status 0
0
test 2: exit status 1
1
test 2: exit status 2
grep: /file_does_not_exist: No such file or directory
2
done