Chinaunix首页 | 论坛 | 博客
  • 博客访问: 134905
  • 博文数量: 28
  • 博客积分: 527
  • 博客等级: 中士
  • 技术积分: 367
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-09 17:05
个人简介

运维开发工程师。致力于网络,WEB应用服务,Linux系统运维。方向:操作系统,监控,自动化

文章分类

全部博文(28)

文章存档

2013年(12)

2012年(16)

分类: LINUX

2013-06-20 08:41:12

退出状态exit status
    定义
        built-in命令,外部命令,函数在退出时,都有退出状态,即返回值,范围:0-255。
        返回值0表示成功
        返回值非0表示失败,其中127为command not found,126为文件存在但无法执行
    访问
        返回值不会打向标准输出。通过$?变量访问返回值
    主动退出并返回一个值
  1. $exit N
----------------------------------------------------------------
if判断
    if结构使用返回值(退出状态)作为判断
    常见if结构:
  1. if judgement
  2. then
  3.     your_clauses_goes_here
  4. else
  5.     your_another_clauses_goes_here
  6. fi
  7. 等价于
  8. if judgement; then
  9. ...
     几种judgement(判断语句的形式),其中term是判断条件
  1. if some_command ; then ....
  2. if test term ; then ...
  3. if [ term ] ; then ...
  4. if [[ term ]] ; 
---------------------------------------------
短路运算符&&和||

    &&,||
        用返回值判断真伪当只要判断出表达式的真伪,即停止表达式的运行。
        sub1 && sub2, sub1成功了才会执行sub2,不然跳过sub2,是‘逻辑与’的判断;
        sub1 || sub2, sub1失败了才会执行sub2,不然跳过sub2,是‘逻辑或’的判断;
    所以:
  1. some_command && {
  2.             code of blocks
  3. }

  4. some_command || {
  5.             code of blocks
  6. }
    
warnings:&& ||只适合if fi的单路结构,不适用于if else fi的双路结构。
        原语句如下:
  1. if sub1
  2. then
  3.     sub2
  4. else
  5.     sub3
  6. fi
        错误的转换1:
  1. sub1 && sub2 || sub3    #错误,当sub1成功时,执行sub2,当sub2在执行过程中异常,返回码不为0,则触发sub3的动作,不符合预期  
        错误的转换2:
  1. sub1 || sub3 && sub2    #错误,当sub1失败时,触发sub3逻辑,如果sub3正常退出,返回码为0,则继续触发sub2动作,不符合预期
 ---------------------------------------------
test命令
    test通过断言判断,产生真伪返回值。一般判断错误为1,test语法错误为2.
    test等价形式为中括号,'[ ]'
    bash 的内部命令,[和test是等同的。test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。

    如,
  1. test "$a" = "$b" 返回0,1        #判断a,b是否为相同的字串
  2. #等价于
  3. [ "$a" && "$b" ] #这里[ ]内部的空格不能少
    常用的判断符号
    关于字串
    [ "$str" ]             #the length of STRING is nonzero
    [ -n "$str" ]          #等价
    [ -z "$str" ]          #相反地,the length of STRING is zero
    [ "$str1" = "$str2" ]    #字串相等,等价于'=='
    [ "$str1" != "$str2" ]   #字串不等

    关于文件

    [ -d "$file" ]        #$file是否为目录
    [ -f "$file" ]        #$file是否为普通文件
    [ -h "$file" ]        #$file是一个符号链接,-L是等价参数
    [ -r "$file" ]        #$file是只读的
    [ -s "$file" ]        #$file非空
    
    关于数字
    [ $num1 -eq $num2 ]    #相等
    [ $num1 -lt $num2 ]    #小于
                            lt:less than
                            gt:greater than
                            le:less and equal
                            ge,greater and equal

    关于联合判断
    [ $a == $b && $b == $c ]         #错误
    [ $a == $b ] && [ $b == $c ]     #正确
    [ $a == $b -a $b == $c ]     #正确,or是-o

    关于否定
    [ ! -f $file ]     #前置file

    warnings:
    1. 强制:使用test或'[ ]'时,参数必须加“$str”,不然[ -n $str ]将失效,当$str里有空格时,判断报错;
    2. 建议:字符串判断前加X,如 [ "X$a" == "X$b" ];
    3. 建议:有些shell不能用浮点数字判断,如 [ 1.23 == 1.23 ]

-------------------------------------
test的扩展形式:双中括号
        test即[],是shell内置命令,test的扩张'[[ ]]'是shell的关键字。
        相同在于:
                判断测试的参数相同,
                产生返回值,用于逻辑判断和控制
        不同在于:
                [[ ]] 不处理单词展开与文件名扩展,即参数不用加""(第三点需要加"")
                [[ ]] 可以支持[[ $a == $b && $b == $c ]], 而test不能
                [[ ]] 支持正则,如[[ abc == ab? ]]返回0,[ abc == ab? ]返回1

        因此,双中括号成为了替代test的方案。
        examples1:
  1. if [ -x ifx.sh -o -r if.sh ]; then echo yes; fi                #写法对
  2. if [ -x ifx.sh ] || [ -r if.sh ]; then echo yes; fi            #等价
  3. if [ -x ifx.sh || -r if.sh ]; then echo yes; fi                #错误!
  4. if [[ -x ifx.sh || -r if.sh ]]; then echo yes; fi                #双中括号,正确
  5. if [ -x ifx.sh -o cat if.sh ]]; then echo yes; fi                #大谬!
  6. if [ -x ifx.sh ] || cat if.sh ; then echo yes; fi                #正确
        example2:
  1. [ "Linux x86_64" == $( uname -m -s ) ] && echo yes         #没加""
  2. -bash: [: too many arguments
  3. [ "Linux x86_64" == "$( uname -m -s )" ] && echo yes        #test要加上
  4. yes
  5. [[ "Linux x86_64" == $( uname -m -s ) ]] && echo yes         #双中括号不用加
  6. yes
        example3:
  1. [[ "abc" == "ab?" ]]    #字串匹配
  2. [[ "abc" == ab? ]]        #正则匹配,危险
  3. [[ "abc" =~ ab? ]]        #正确的正则匹配,所以在这一点上,为了保险起见,还是[[ "$str1" == "$str2]]好,避免正则而非字串形式被匹配到

参考
    http://blog.sina.com.cn/s/blog_7e9efc570101ak1y.html

        
        

阅读(1689) | 评论(0) | 转发(0) |
0

上一篇:013-正则BRE积累

下一篇:017-date

给主人留下些什么吧!~~