zoukankan      html  css  js  c++  java
  • shell if 判断

    shell if 判断
    Shell数值、字符串比较
    Chenxin
    20181031 update
    整数比较
    -eq 等于,如:if [ "$a" -eq "$b" ]
    -ne 不等于,如:if [ "$a" -ne "$b" ]
    -gt 大于,如:if [ "$a" -gt "$b" ]
    -ge 大于等于,如:if [ "$a" -ge "$b" ]
    -lt 小于,如:if [ "$a" -lt "$b" ]
    -le 小于等于,如:if [ "$a" -le "$b" ]
    < 小于(需要双括号),如:(("$a" < "$b"))
    <= 小于等于(需要双括号),如:(("$a" <= "$b"))

    大于(需要双括号),如:(("$a" > "$b"))
    

    = 大于等于(需要双括号),如:(("$a" >= "$b"))
    字符串比较
    = 等于,如:if [ "$a" = "$b" ]
    == 等于,如:if [ "$a" == "$b" ],与=等价
    注意:的功能在[[]]和[]中的行为是不同的,如下:
    1 [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么将为true
    2 [[ $a == "z" ]] # 如果$a等于z(字符匹配),那么结果为true
    3
    4 [ $a == z* ] # File globbing 和word splitting将会发生
    5 [ "$a" == "z" ] # 如果$a等于z(字符匹配),那么结果为true
    一点解释,关于File globbing是一种关于文件的速记法,比如"*.c"就是,再如~也是.但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.
    != 不等于,如:if [ "$a" != "$b" ]
    这个操作符将在[[]]结构中使用模式匹配.
    < 小于,在ASCII字母顺序下.如:
    if [[ "$a" < "$b" ]]
    if [ "$a" < "$b" ]
    注意:在[]结构中"<"需要被转义.
    大于,在ASCII字母顺序下.如:
    if [[ "$a" > "$b" ]]
    if [ "$a" > "$b" ]
    注意:在[]结构中">"需要被转义.
    -z (或者是"!") 字符串为"null".就是长度为0. 或者是用"!"惊叹号.
    -n 字符串不为"null" :[ -n "$2"]参数2不为空(注意只是一个中括号,><
    这些使用2个[])
    注意:
    使用-n在[]结构中测试必须要用""把变量引起来.使用一个未被""的字符串来使用! -z 的方式.
    或者就是未用""引用的字符串本身,放到[]结构中。虽然一般情况下可以工作,但这是不安全的.习惯于使用""来测试字符串是一种好习惯.
    if使用test
    示例,if [ -d /home/lzadmin/.ssh ];then...
    1)判断表达式
    if test (表达式为真)
    if test !表达式为假
    test 表达式1 –a 表达式2 两个表达式都为真
    test 表达式1 –o 表达式2 两个表达式有一个为真
    2)判断字符串
    test –n 字符串 字符串的长度非零
    test –z 字符串 字符串的长度为零
    test 字符串1=字符串2 字符串相等
    test 字符串1!=字符串2 字符串不等
    3)判断整数
    test 整数1 –eq 整数2 整数相等
    test 整数1 –ge 整数2 整数1大于等于整数2
    test 整数1 –gt 整数2 整数1大于整数2
    test 整数1 –le 整数2 整数1小于等于整数2
    test 整数1 –lt 整数2 整数1小于整数2
    test 整数1 –ne 整数2 整数1不等于整数2
    4)判断文件
    test File1 –ef File2 两个文件具有同样的设备号和i结点号
    test File1 –nt File2 文件1比文件2 新
    test File1 –ot File2 文件1比文件2 旧
    test –b File 文件存在并且是块设备文件
    test –c File 文件存在并且是字符设备文件
    test –d File 文件存在并且是目录
    test –e File 文件存在
    test –f File 文件存在并且是正规文件
    test –g File 文件存在并且是设置了组ID
    test –G File 文件存在并且属于有效组ID
    test –h File 文件存在并且是一个符号链接(同-L)
    test –k File 文件存在并且设置了sticky位
    test –b File 文件存在并且是块设备文件
    test –L File 文件存在并且是一个符号链接(同-h)
    test –o File 文件存在并且属于有效用户ID
    test –p File 文件存在并且是一个命名管道
    test –r File 文件存在并且可读
    test –s File 文件存在并且是一个套接字
    test –t FD 文件描述符是在一个终端打开的
    test –u File 文件存在并且设置了它的set-user-id位
    test –w File 文件存在并且可写
    test –x File 文件存在并且可执行
    SHELL下的数字比较及计算举例
    比较:
    方法一: if [ ${A} -lt ${B} ]; then ...
    这是最基本的比较方法,使用lt(小于),gt(大于),le(小于等于),ge(大于等于),优点:还没发现;缺点:只能比较整数,使用lt,gt等不直观
    方法二: if ((${A} < ${B})) then ...
    这是CShell风格比较,优点:不用使用lt,gt等难记的字符串;缺点:还是只能比较整数
    方法三: if (echo ${A} ${B} | awk '!($1>$2){exit 1}') then ...
    这是使用awk比较,优点:可以比较小数;缺点:表达式太复杂,难记
    方法四: if (echo ${A} - ${B} | bc -q | grep -q "^-"); then ...
    这是使用bc计算比较,优点:可以比较小数;缺点:表达式更复杂,难记
    计算:
    方法一:typeset C=$(expr ${A} + ${B});
    SHELL中的基本工具,优点:方便检测变量是否为数字;缺点:只能计算整数,且只能计算加减法,不能计算乘除法
    方法二:let "C=${A}+${B}"; 或 let "C=A+B"
    内嵌命令计算,优点:能计算乘除法及位运算等;缺点:只能计算整数
    方法三:typeset C=$((A+B))
    CShell风格的计算,优点:能计算乘除法及位运算等,简介,编写方便;缺点:不能计算小数
    方法四:typeset C=${echo ${A} ${B} | awk '{print $1+$2}')
    使用awk计算,优点:能计算小数,可以实现多种计算方式,计算灵活;缺点:表达式太复杂
    方法五:typeset C=${echo ${A} + ${B} | bc -q)
    使用awk计算,优点:能计算小数,计算方式比awk还多,计算灵活;缺点:表达式太复杂,小数点后面的位数必须使用scale=N来设置,否则可能会将结果截断为整数
    if的或关系
    习惯于使用""来测试字符串是一种好习惯.使用-n在[]结构中测试必须要用""把变量引起来.
    使用一个未被""的字符串来使用! -z .或者就是未用""引用的字符串本身,放到[]结构中。虽然一般情况下可以工作,但这是不安全的.

    bash上可以:
    if [ -n "$inVar5" ] || [ -n "$inVar6" ]; then
    在bash 下
    if [ -z $inVar5 -o -z $inVar6 ]
    在tcsh下
    if [ -z $inVar5 || -z $inVar6 ]

    if判断ip地址
    cat t.sh

    !/bin/bash

    IFS是shell的内部变量

    ip=$1
    if [[ $ip =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; then
    

    先将系统的IFS的默认值放入到OIFS临时变量中

        OIFS=$IFS
    

    赋予.给IFS

        IFS='.'
        ip=($ip)
    

    恢复IFS变量的默认值,如果不恢复会造成系统异常

        IFS=$OIFS
        if [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]];then
        echo "$ip is the right IP address"
        else
        echo "$ip is wrong IP!!!"
        fi
        else
        echo "$ip is wrong IP!!!"
    fi
  • 相关阅读:
    是否可以从一个静态(static)方法内部发出对非静态 (non-static)方法的调用?
    是否可以继承 String 类?
    如何实现字符串的反转及替换?
    String s = new String(“xyz”);创建了几个字符串对象?
    Serial 与 Parallel GC 之间的不同之处?
    SVG是什么?
    阐述静态变量和实例变量的区别?
    Java 中 ++ 操作符是线程安全的吗?
    什么是 REST / RESTful 以及它的用途是什么?
    WebSQL是HTML 5规范的一部分吗?
  • 原文地址:https://www.cnblogs.com/chanix/p/12738163.html
Copyright © 2011-2022 走看看