免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11912 | 回复: 10
打印 上一主题 下一主题

shell 中if 的条件表达式 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-29 22:21 |只看该作者 |倒序浏览
在shell中,经常会用到如下if句式:

shell 命令
if [ $? -eq 0 ]
then
    echo "command success"
fi
这种方式好理解,因为shell命令执行成功一半都返回0,否则返回1.

但有时也会用到下面这种if句式:
if (shell命令)
then
  ...
else
  ..
fi

例如:
if(rm -rf test)
then
    ...
then
   ...
fi

问题是: if括号里的命令执行状态是什么的时候,执行then, 否则执行else?
请达人赐教,谢谢!

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-02-10 06:20:01IT运维版块每日发帖之星
日期:2016-02-11 06:20:00
2 [报告]
发表于 2009-12-29 22:29 |只看该作者

回复 #1 ascid 的帖子

这个主要看执行的命令了

比如
$grep root /etc/passwd
执行后,如果返回结果了说明$?=0,如果什么结果也 没有就是$?!=0

我感觉这个跟命令有关系,

touch命令,无论怎么执行,他都不会返回一个错误的!!

你要自己写一个判断,,你可以先执行下,看看$?是多少来具体看if语句怎么写了

论坛徽章:
0
3 [报告]
发表于 2009-12-29 22:46 |只看该作者

回复 #2 nxlinux 的帖子

我觉的你说的是第一种情况,那个我是理解的。
但对于第二种,却是:
if(grep root /etc/passwd)
then
     echo "find the root in /etc/passwd"   # 找到root,命令grep返回值$?=0.但却执行了then后面的语句
else
     echo "no root in /ect/passwd"
fi

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
4 [报告]
发表于 2009-12-29 22:52 |只看该作者

回复 #3 ascid 的帖子

()也是命令,compound command

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-02-10 06:20:01IT运维版块每日发帖之星
日期:2016-02-11 06:20:00
5 [报告]
发表于 2009-12-30 02:23 |只看该作者

回复 #3 ascid 的帖子

if command;then
        command命令返回结果为true,也就是0,那么就执行;
        如果你不知道command返回什么结果,那你先自己测试下,在做决定
else
   command命令返回结果为false,也就是不是0,那么就这行;
fi

论坛徽章:
0
6 [报告]
发表于 2009-12-31 20:49 |只看该作者

回复 #5 nxlinux 的帖子

谢谢,理解了! 其实if中, " [ "本身也是个命令,等价于test, 这点我疏忽了,造成我的困惑。

论坛徽章:
0
7 [报告]
发表于 2010-01-01 11:38 |只看该作者
原帖由 blackold 于 2009-12-29 22:52 发表
()也是命令,compound command


黑哥的意思是$?已经是()命令后的返回值,而不是grep的返回值?

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-02-10 06:20:01IT运维版块每日发帖之星
日期:2016-02-11 06:20:00
8 [报告]
发表于 2010-01-01 13:44 |只看该作者

回复 #7 alfred1980 的帖子

()里面的命令应该是在子shell下执行,同样会有返回值的,我想应该是grep返回的

论坛徽章:
0
9 [报告]
发表于 2010-01-01 14:20 |只看该作者
那一般情况下1应该是ture,0应该是false?
那和黑哥额外的提到()也是个命令矛盾了誒?
我记得,应该是shell会对if和then之间的最后一个命令返回值进行判断吧!
莫非unix下0标识成功?

[ 本帖最后由 alfred1980 于 2010-1-1 15:01 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2010-01-01 14:36 |只看该作者
截取了一段代码:
local line=`grep -n $string $file`
     9    if [ $? -eq 0 ]
    10    then
    11      printf "$string is found as the %drd line in $file \n" `echo $line \
                         | cut -f1 -d:`
    12      num=`grep $string $file | wc -l`
    13      rtn=0
    14    else
    15      printf "$string is not found in $file \n"
    16      num=0
    17      rtn=1
    18    fi

在这里其实不管grep成功匹配与否,$?都是0,因为是local的返回值!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP