关于shell变量问题

写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,那么你应该知道全局变量和局部变量,你就不会犯这样的错误了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值