有没有办法防止var = $(foo | grep bar)导致set -e退出我的脚本?

时间:2016-10-10 20:27:49

标签: bash

我想添加一条ip路由,以防它不存在。为此,我执行以下操作:

set -e
output=$(ip route | cut -d" " -f1 | grep $ip_range)
if [ -z "$output" ]; then
ip route add $ip_range dev br-int
fi

然而,正如我所知,如果grep找不到任何东西,它会以状态1退出,因为set -e而结束了脚本。我考虑过使用:

set +e
在执行grep的行之前的

(注意在set -e和执行grep的行之间有代码,但为了简单起见我删除了它)。但是,我认为这有点难看。还有另一种方式吗?

4 个答案:

答案 0 :(得分:2)

删除set -e并使用grep -q

if ! ip route | cut -d " " -f1 | grep -q "$ip_range"; then
   ip route add $ip_range dev br-int
fi

Why set -e should be avoided

ip_route可能会失败,因此您可以使用:

set -o pipefail
if ! ip route | cut -d " " -f1 | grep -q "$ip_range"; then
   ip route add $ip_range dev br-int
fi

答案 1 :(得分:1)

只需使用最终返回0的命令。

$ output=$(ip route | cut -d" " -f1 | grep $ip_range ; exit 0) ; echo $?
0

答案 2 :(得分:0)

您可以使用$(ip route | cut -d" " -f1 | (grep $ip_range || true))。这是在子shell中运行grep并使用||(或)运行命令,如果grep存在非零,在本例中为true,以便整个子shell返回零。

答案 3 :(得分:0)

grepcut的更好替代方法是在awk使用awk,因为0将返回output=$(ip route | awk -v ip_range="${ip_range}" '$1==ip_range{print $1}') ,无论是否打印过某些内容:

Sybase.AdoNet4.AseClient.dll