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

问题描述 投票:4回答:1

考虑这个简单的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没有被执行,但是它被清楚地执行了(因为脚本需要几秒钟来写“Ok!”)。

我想知道是否有办法避免/优化这种行为?

bash
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.