当我使用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语句就会被触发。发生了什么,我该如何解决这个问题?
答案 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)