考虑以下简单的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!”。)
我想知道是否有一种方法可以避免/优化这种行为?
答案 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