set -e让函数提前停止运行?

时间:2016-01-16 00:20:48

标签: bash shell exit-code

当我使用set -e打开错误时,我的某个功能似乎已中断。我怀疑它按预期工作,但我看不出我做错了什么。

这是功能:

#!/usr/bin/env bash

set -e

my_function() {
    base_dir="/tmp/test"
    if [ ! -d $base_dir ]; then
        echo "Creating $base_dir"
        mkdir -p $base_dir
        touch $base_dir/some-file.txt
    fi

    is_edited=$(grep "foo" $base_dir/some-file.txt)

    if [ ! -z $is_edited  ]; then
        cd $base_dir
        echo "Doing stuff"
        docker run --rm debian ls
    fi

    echo
    echo "Done"
    echo
}

my_function

set -e打开的情况下,函数看似没有点击echo语句。关闭set -e后,echo语句就会被触发。发生了什么,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

尝试使用:

is_edited=$(grep "foo" $base_dir/some-file.txt || test $? -eq 1)

grep的退出状态为0如果找到匹配,1如果找不到匹配,2是否有实际错误。因此,如果文件中的foo不匹配,则会将其视为错误,set -e将终止脚本。上面的代码将1转换为成功,因此只有在grep出现真正的错误时脚本才会终止。

如果grep出现错误,如果您不关心终止脚本,可以使用

if grep -1 "foo" $base_dir/some-file.txt ; then
    ...
fi

-q选项使其无法打印匹配行,只需根据是否找到匹配项设置退出状态。

答案 1 :(得分:1)

如fmtn07所述,它带有返回码。

尝试从以下位置更改grep语句:

is_edited=$(grep "foo" $base_dir/some-file.txt)

为:

is_edited=$(grep "foo" $base_dir/some-file.txt || true)