zoukankan      html  css  js  c++  java
  • Shell运算符

    1、条件表达式

    表达式 [ expression ] [[ expression ]] [[ test expression ]]
    示例 [ 1 –eq 1 ] [[ 1 –eq 1 ]] test 1 –eq 1,等同于[ 1 -eq 1 ]

    2、整数比较

    比较符 描述 示例
     -eq,equal 等于  [ 1 -eq 1]为true
     -ne,not equal 不等于  [ 1 -ne 1 ]为false
     -gt,greater than 大于  [ 2 -gt 1 ]为true
     -lt,lesser than 小于  [ 2 –lt 1 ]为false
     -ge,greater or equal 大于等于  [ 2 –gt 1 ]为true
     -le,lesser or equal 小于等于  [ 2 –le 1 ]为false

    3、字符串比较

     运算符  描述  示例
    ==  等于  [ “a” == “a” ]为true
    !=  不等于  [ “a” != “a” ]为false
    > 大于,判断字符串时根据ASCII码表顺序,不常用 在[ ]表达式中:[ 2 > 1 ]为true
    在[[ ]]表达式中:[[ 2 > 1 ]]为true
    在(( ))表达式中:(( 3 > 2 ))为true
    < 小于,判断字符串时根据ASCII码表顺序,不常用 在[ ]表达式中:[ 2 < 1 ]为false
    在[[ ]]表达式中:[[ 2 < 1 ]]为false
    在(( ))表达式中:(( 3 < 2 ))为false
    >= 大于或等于 在(( ))表达式中:(( 3 >= 2 ))为true
    <= 小于或等于 在(( ))表达式中:(( 3 <= 2 ))为false
    -n 字符串长度不等于0为真 VAR1=1;VAR2=””
    [ -n “$VAR1” ]为true
    [ -n “$VAR2” ]为false
    -z  字符串长度等于0为真 VAR1=1;VAR2=””
    [ -z “$VAR1” ]为false
    [ -z “$VAR2” ]为true
    str  字符串存在为真 VAR1=1;VAR2=””
    [ “$VAR1” ]为true
    [ “$VAR2” ]为false

    需要注意的是,使用-z或-n判断字符串长度时,变量要加双引号
    举例说明:
    #[ -z $a ] && echo yes || echo no
    yes
    #[ -n $a ] && echo yes || echo no
    yes
    #使用双引号才能正常判断是否为空
    #[ -z “$a” ] && echo yes || echo no
    yes
    #[ -n “$a” ] && echo yes || echo no
    no
    使用双中括号时就不需要用双引号
    #[[ -z $a ]] && echo yes || echo no
    yes
    #[[ -n $a ]] && echo yes || echo no
    no

    4、文件测试
    文件测试语法示例:[ -f /var/log/iptables.log ],iptables.log文件存在为true
    [ ! -f /var/log/iptables.log ],iptables.log文件不存在为true

    测试符 说明
     -f     file 文件存在且为普通文件为真
     -d    directory 文件存在且为目录文件为真
     -s     size 文件存在且文件大小不为0为真
     -e     exist 只要有文件则为真,区别于-f
     -r     read 文件存在且可读为真
     -w    write 文件存在且可写为真
     -x     executable 文件存在且可执行为真
     -L     link 文件存在且为链接文件为真
     -O 文件是否存在并且属于当前用户所有
     -G 文件是否存在并且默认组与当前用户相同
     f1 -nt f2  (new than) 文件f1比f2新为真(根据文件修改时间判断)
     f1 -ot f2   (old than) 文件f1比f2旧为真(根据文件修改时间判断)

    5、布尔运算符

    运算符 描述 示例
    ! 非关系,条件结果取反 [ ! 1 -eq 2 ] 为true
    -a 和关系,在[ ]表达式中使用 [ 1 –eq 1 –a 2 –eq 2 ]为true
    -o 或关系,在[ ]表达式中使用 [ 1 –eq 1 –o 2 –eq 1 ]为true

    6、逻辑判断符

    判断符   描述  示例
    && 逻辑与
    在[[ ]]和(( ))表达式中或判断表达式是否为真时使用
    [[ 1 -eq 1 && 2 -eq 2 ]] 为true
    (( 1 == 1 && 2 == 2 ))为true
    [ 1 –eq 1 ] && echo yes
    (如果&&前面表达式为true则执行后面的)
    || 逻辑或
    在[[ ]]和(( ))表达式中或判断表达式是否为真时使用
    [[ 1 -eq 1 || 2 –eq 1 ]] 为true
    (( 1 == 1 || 2 == 1 )) 为true
    [ 1 –eq 2 ] || echo yes
    (如果||前面表达式为false则执行后面的)

    7、整数运算

    运算符 + - * / %
    描述 取余
    运算表达式 $((  )) $[  ]
    示例 $((1+1)) $[1+1]

    注:$(( ))和$[ ]都不支持浮点运算
    $(( ))表达式还有一个用途,支持三目运算:
    #如果条件为真默认返回0,否则返回1
    #echo $((1<0))
    0
    #echo $((1>0))
    1
    指定输出数字:
    #echo $((1>0?1:2))
    1
    #echo $((1<0?1:2))
    2
    注意:不支持字符串
    除了Shell本身的算数运算表达式,还有几个命令支持复杂的算数运算:

    命令  描述  示例
    let 赋值并运算,支持++、-- let VAR=(1+2)*3 ; echo $VAR
    x=10 ; y=5
    let x++;echo $x 每执行一次x加1
    let y--;echo $y 每执行一次y减1
    let x+=2 每执行一次x加2
    let x-=2 每执行一次x减2
    expr 乘法需要加反斜杠转义* expr 1 * 2 运算符两边必须有空格
    expr ( 1 + 2 ) *2 使用双括号时要转义
    bc 计算器,支持浮点运算、平方等 bc本身就是一个计算器,可直接输入命令,进入解释器
    echo 1 + 2 |bc 将管道符前面的标准输入作为bc的标准输入
    echo “10^10”|bc
    echo ‘scale=2;10/3’|bc用scale保留两位小数点

    8、Shell括号用途总结

    符号                            说明
    ( ) 用途1:在运算中,先计算小括号里面的内容;
    用途2:数组;
    用途3:匹配分组
    (( )) 用途1:表达式,不支持-eq这类的运算符。不支持-a和-o,支持<=、>=、<、>这类比较符和&&、||;
    用途2:C语言风格的for(( ))表达式
    $( ) 执行shell命令,与反引号等效(`  `)
    $(( )) 用途1:简单算数运算
    用途2:支持三目运算符 $(( 表达式?数字:数字 ))
    [ ] 条件表达式,里面不支持逻辑判断符
    [[ ]] 条件表达式,里面不支持-a和-o,不支持<=和>=比较符,支持-eq、<、>这类比较符。支持=~模式匹配,也可以不用双引号也不会影响原意,比[ ]更加通用
    $[ ] 简单算数运算
    { } 对逗号(,)和点点(…)起作用,比如touch {1,2}创建文件1和文件2,touch{1..3}创建文件1、2和3
    ${ } 用途1:引用变量
    用途2:字符串处理
    << >> 双尖括号用到的运算符:val++(后增);val--(后减);++val(先增);--val(先减);!(逻辑求反);~(位求反);**(幂运算);<<(左位移);>>(右位移);&(位布尔和);|(位布尔或);&&(逻辑和);||(逻辑或);(注:双尖括号中的特殊符号不需要转义)

    9、Shell中的浮点运算
    variable=`echo "options; expression" | bc` (bc是bash内建的计算器,用来作浮点运算)
    options允许设置变量。如果需要设置不止一个变量,可以用分号来分开它们。expression参数定义了通过bc执行的数学表达式。例:
    #!/bin/bash
    var1=`echo "scale=4; 3.44 / 5" | bc`
    echo The answer is $var1
    当然,一旦一个值被赋给了变量,那这个赋了值的变量就能在其它运算中使用了:
    #!/bin/bash
    var1=20
    var2=3.14159
    var3=`echo "scale=4; $var * $var1" | bc`
    var4=`echo "scale=4; $var3 *$var2" | bc`
    如果有很多运算,可以将输出结果赋给一个变量,例:
    #!/bin/bash
    var1=10.46
    var2=43.67
    var3=33.2
    var4=71
    var5=$(bc << EOF
    scale = 4
    a1 = ( $var1 * $var2 )
    b1 = ( $var3 * $var4 )
    a1 + b1
    EOF
    )
    echo The final answer for this mess is $var5

    Shell中浮点运算可以借助bc来完成需求:
    #echo "1.2 < 2" |bc
    1
    #echo "1.2 > 2" |bc
    0
    #echo "1.2 == 2.2" |bc
    0
    #echo "1.2 != 2.2" |bc
    1
    运算结果如果为真返回1,否则返回0,写一个例子:
    #[ $(echo "2.2 > 2"|bc) -eq 1 ] && echo yes || echo no
    yes
    #[ $(echo "2.2 < 2"|bc) -eq 1 ] && echo yes || echo no
    no
    expr还可以对字符串操作:
    获取字符串长度:
    #expr length "string"
    6
    截取字符串:
    #expr substr "string" 4 6
    ing
    获取字符在字符串中出现的位置:
    #expr index "string" str
    1
    #expr index "string" i
    4
    获取字符串开始字符出现的长度:
    #expr match "string" s.*
    6
    #expr match "string" str
    3
    注:
    shell中使用expr来处理数学表达式,但特别笨拙,例:#expr 1 + 5如果使用expr 1 * 5时,*需要转义,写成expr 1 * 5。所以一般用$[1+5]这种方式来处理数学表达式,注:使用$方括号时乘号不需要转义,例:$[ 1 * 5]。但这种方式不能进行浮点运算

    100以内所有数相加的和
    n=0;for i in {1..100};do n=$(($n + $i));done echo $n
    5050
    100以内所有奇数相加和所有偶数相加的和
    n=0;m=0;for i in {1..100};do l=$(($i%2));if [ $l -eq 0 ];then n=$(($n+$i));else m=$(($m+$i));fi done;echo $n,$m
    2550,2500

    参考链接:
           http://oldboy.blog.51cto.com/2561410/767862

  • 相关阅读:
    Oracle SQL性能优化
    spring aop简单日志实例
    一个简单的Spring AOP例子
    jQuery的三种$()
    Mac 上的 outlook 一直让输入密码
    idea 中设置成公司规范的代码格式
    Java 中的锁——Lock接口
    TimeUnit枚举类
    Thread.join()的使用
    java线程的等待、通知机制【读书笔记】
  • 原文地址:https://www.cnblogs.com/xwupiaomiao/p/11276290.html
Copyright © 2011-2022 走看看