逻辑OR评估Bash脚本中的所有表达式

时间:2018-07-12 21:12:41

标签: bash

考虑以下简单的shell脚本:

#!/bin/bash

exp1="[ $1 -gt 5 ]";
exp2="[ `ping localhost -c 4 | wc -l` -gt 0 ]";

if eval $exp1 || eval $exp2
then
   echo Ok!
fi

我期望将10传递到此脚本,但ping并未执行,但可以清楚地执行ping(因为脚本需要几秒钟的时间才能写出“ OK!”。)

我想知道是否有一种方法可以避免/优化这种行为?

1 个答案:

答案 0 :(得分:4)

它将执行ping,因为您具有:

exp2="[ `ping localhost -c 4 | wc -l` -gt 0 ]";

使用之前的命令替换来评估由于双引号引起的情况。

使用单引号将执行延迟到eval行,如下所示:

#!/bin/bash

exp1='[[ $1 -gt 5 ]]'
exp2='[[ $(ping localhost -c 4 | wc -l) -gt 0 ]]'

if eval $exp1 || eval $exp2
then
   echo Ok!
fi

更好的是,使用功能Don't store commands in variables!

exp1() { [[ $1 -gt 5 ]]; }
exp2() { [[ $(ping localhost -c 4 | wc -l) -gt 0 ]]; }

if exp1 "$1" || exp2
then
   echo Ok!
fi