2016-01-16 33 views
0

我有一個功能,似乎打破了,當我打開set -e錯誤。我懷疑它是按照預期工作的,但我看不出我做錯了什麼。設置-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後,回聲語句被擊中。發生了什麼,我該如何解決這個問題?

+1

如果grep沒有找到匹配項,它將返回一個非零的退出碼。這將被'set -e'視爲錯誤。 – Barmar

+0

@Barmar啊,這很有道理。也許有更好的方法比使用grep還有更好的方法來處理它的返回值嗎? – jmreicha

回答

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選項,可以不打印匹配的行,就設置根據是否退出狀態它發現了一場比賽。

+0

這有效。另外,謝謝你的解釋。 – jmreicha

1

如fmtn07所述,它與返回碼一起使用。

嘗試從改變grep的語句:

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

到:

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

+0

如果'grep'真的發生錯誤,這將防止腳本中止。 – Barmar