写shellif多次判断时遇到一个问题,随手记下来。
问题:执行如下if.sh脚本,当new.txt和old.txt两文件一样时,输入2后,执行结果是problem。
[root@localhost ~]# cat if.sh
#!/bin/bash
diff /root/new.txt /root/old.txt
read -p "Please input a number:" result
#A=`echo $?`
if [[ $result -eq 3 ]];then
echo "ok"
elif [[ $?-eq 0 ]] && [[ $result -eq 2 ]];then
echo "ok"
elif [[ $? -eq 1 ]] && [[ $result -eq 2 ]];then
echo "problem"
elif [[ $result -eq 1 ]];then
echo "problem"
elif [[ $result -eq 0 ]];then
echo "problem"
fi
[root@localhost ~]# sh if.sh
Please input a number:2
problem
有没有感觉很奇怪,按照最初想法,当两个文件一样时,输入2结果应该输出ok才对,即执行if判断第二条elif,但事实确实执行了if判断第三条elif。
如果将脚本改成如下,则不会出现上述错误问题。(因为你重新定义了变量名)
[root@localhost ~]# cat if.sh
#!/bin/bash
diff /root/new.txt /root/old.txt
read -p "Please input a number:" result
A=`echo $?`
if [[ $result -eq 3 ]];then
echo "ok"
elif [[ $A -eq 0 ]] && [[ $result -eq 2 ]];then
echo "ok"
elif [[ $A -eq 1 ]] && [[ $result -eq 2 ]];then
echo "problem"
elif [[ $result -eq 1 ]];then
echo "problem"
elif [[ $result -eq 0 ]];then
echo "problem"
fi
[root@localhost ~]# sh if.sh
Please input a number:2
ok
原因分析:
出现上述问题原因在于变量的应用,由于$?仅仅只是针对上一条命令执行的结
果,在第一个脚本中运行是这样的,先执行diif获得结果0,然后if判断第一次
由于不满足条件,会输出返回值1,在第二次elif中的$?被重新定义为1,然后继续执行,所以会得到结果problem
解决办法:可以像第二个脚本中,将变量名重新定义,以便区分开来
题外话:如果你学习过Python,那么你应该知道全局变量和局部变量,你就不会犯这样的错误了。