zoukankan      html  css  js  c++  java
  • bash脚本编程之二 条件判断and 逻辑运算

    1、条件测试结构

     1) if/then结构:

     判断命令列表的退出码是否为0,0为成功。

     如果if和then在条件判断的同一行上的话, 必须使用分号来结束if表达式

     if和then都是关键字。

     关键字(或者命令)如果作为表达式的开头, 并且如果想在同一行上再写一个新的表达式的话, 那么必须使用分号来结束上一句表达式。
    if [ condition1 ]
    then
        command1
        command2
        command3
    elif [ condition2 ]
    then
    # 与else if一样
        command4
        command5
    else
        default-command
    fi
     if/then结构可以包含嵌套的比较操作和条件判断操作:
    if echo "Next *if* is part of the comparison for the first *if*."
        if [[ $comparison = "integer" ]]
            then (( a < b ))
        else
            [[ $a < $b ]]
        fi
    then
        echo '$a is less than $b'
    fi

    2) 内建命令[与test命令等价,把参数作为比较表达式和文件测试,true返回0,false返回1。

    注意:[ 数字 ]、[ 字符串 ]都为真,NULL(空状态)、未未定义(或者叫为初始化的变量)、初始化但赋值为null的变量为假

    3) bash2.02以后支持[[..]]关键字,比[]结构更加通用

    在[[]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换;使用[[]]能防止脚本中的很多逻辑错误,比如 &&, ||, <, >操作符能正常存在于[[]]中,如果出现在[]中会报错。

    if [ $a = "123" && $b = "456" ];then //报错
        echo "True"
    else
        echo "False"
    fi
     
    if [[ $a = "123" && $b = "456" ]];then //正确
        echo "True"
    else
        echo "False"
    fi
     
    if [ $a = "789" || $b = "456" ];then //报错
        echo "True"
    else
        echo "False"
    fi
     
    if [[ $a = "789" || $b = "456" ]];then //正确
        echo "True"
    else
        echo "False"
    fi
     
    if [ $a < $b ];then //报错
        echo "True"
    else
        echo "False"
    fi
     
    if [[ $a < $b ]];then //正确
        echo "True"
    else
        echo "False"
    fi

    4) 列表结构

    在中括号中的条件判断不一定非得有if

    1
    2
    [ "$var1" -ne "$var2" ] && echo "$var1 is not equal to $var2"
    [ -d "$home" ] || echo "$home directory does not exist."

    双中括号也是可以的

    5) ((…))和let …, 当算数表达式的结果非零时,返回退出状态码0

    2、文件测试操作符

    -e 文件存在

    -f  一个一般文件(不是目录或者设备文件)

    -s 文件大小不为0

    -d 一个目录

    -b 块设备

    -c 字符设备

    -p 管道

    -h or –L 符号链接

    -S socket

    -t 文件描述符被关联到一个终端设备上,一般用来检测stdin([ -t 0 ])和stdout([ -t 1 ])是否来自于一个终端

    -r 文件是否具有可读权限

    -w 文件是否具有可写权限

    -x 文件是否具有可执行权限

    -u set-user-id (suid)标记被设置到文件上。如果一个root用户所拥有的二进制可执行文件设置了set-user-id标记位的话, 那么普通用户也会以root权限来运行这个文件。

    对于设置了suid标志的文件, 在它的权限列中将会以s表示。注意这样可能导致安全漏洞

    -k 设置粘贴位

    对于"粘贴位"的一般了解, save-text-mode标志是一个文件权限的特殊类型。如果文件设置了这个标志, 那么这个文件将会被保存到缓存中, 这样可以提高访问速度。粘贴位如果设置在目录中, 那么它将限制写权限. 对于设置了粘贴位的文件或目录, 在它们的权限标记列中将会显示t。在当代unix系统中,文件已经不使用粘贴位,只在目录中用

    -N 从文件上一次被读取到现在为止,文件是否被修改过

    f1 –nt f2 文件f1比文件f2新

    f1 –ot f2 文件f1比文件f2旧

    f1 –ef f2 文件f1和f2是相同文件的硬链接

    ! 翻转测试结果

    3、其他比较操作符

    1) 整数比较

    在中括号中使用:-eq、-ne、-gt、-ge、-lt、-le

    在双小括号中使用:<、<=、>、>=

    2) 字符串比较

    =与==等价。注意,==在双中括号和单中括号中行为不同:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    a="zabc"
    [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么结果将为真
    [[ $a == "z*" ]] # 如果$a与z*相等(就是字面意思完全一样), 那
    么结果为真.
     
    a=abc.conf #abc.conf is a file
    [ $a == abc* ] # 文件扩展匹配(file globbing)和单词分割有
    效.True
    a="abcdef" #just a string, not a file
    [ $a == abc* ] #False
     
    [ "$a" == "z*" ] # 如果$a与z*相等(就是字面意思完全一样), 那
    么结果为真.
     
    #总结起来,[]的使用很危险,存在各种可能的扩展,如果要用,最好对变量加上引号

    !=,不等,在[[]]中使用模式匹配

    <、>在[]结构中要转义

    -z 字符串为null,就是字符串长度为0

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
    a="hello"
    b=""
    c=
    [ -z $a ] && echo "a null"
    [ -z $b ] && echo "b null"
    [ -z $c ] && echo "c null"
    [ -z $d ] && echo "d null"
     
    #结果
    #b null
    #c null
    #d null

    -n 字符串不为null。当-n使用在中括号中进行条件测试的时候, 必须要把字符串用双引号引用起来。

    -a 逻辑与。 exp1 –a exp2; -o 逻辑或 exp1 –o exp2;这与Bash中的比较操作符&&和||非常相像, 但是&&和||是用在双中括号结构中的。

    特别注意:在一个混合测试中, 即使使用引用的字符串变量也可能还不够。如果$string为空的话, [ -n "$string" -o "$a" = "$b" ]可能会在某些版本的Bash中产生错误. 安全的做法是附加一个额外的字符给可能的空变量, [ "x$string" != x -o "x$a" = "x$b" ] ("x"字符是可以相互抵消的).

  • 相关阅读:
    多维数组的索引与切片
    多维数组
    开学第一课Java考试
    大一第九周学习体会
    大一第八周学习体会
    大一第七周学习体会
    大一第六周学习体会
    大一第五周学习体会
    《大道至简》读后感
    大一暑假第四周学习体会
  • 原文地址:https://www.cnblogs.com/client-server/p/5520088.html
Copyright © 2011-2022 走看看