考虑这个简单的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!”)。
我想知道是否有办法避免/优化这种行为?
它将执行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