zoukankan      html  css  js  c++  java
  • Shell从入门到精通进阶之三:表达式与运算符

    3.1 条件表达式

    表达式

    示例

    [ expression ] [ 1 -eq 1 ] 
    ` expression ` ` 1 -eq 1 `
    test expression test 1 -eq 1 ,等同于[]

    3.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.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
    # 使用了双中括号就不用了双引号
    # [[ -n $a ]] && echo yes || echo no
    no
    # [[ -z $a ]] && echo yes || echo no
    yes

    3.4 文件测试

    测试符

    描述

    示例

    -e 文件或目录存在为真 [ -e path ] path存在为true
    -f 文件存在为真 [ -f file_path ] 文件存在为true
    -d 目录存在为真 [ -d dir_path ] 目录存在为true
    -r 有读权限为真 [ -r file_path ] file_path有读权限为true
    -w 有写权限为真 [ -w file_path ] file_path有写权限为true
    -x 有执行权限为真 [ -x file_path ] file_path有执行权限为true
    -s 文件存在并且大小大于0为真 [ -s file_path ] file_path存在并且大小大于0为true

    3.5 布尔运算符

    运算符

    描述

    示例

    ! 非关系,条件结果取反 [ ! 1 -eq 2 ]为true
    -a 和关系,在[]表达式中使用 [ 1 -eq 1 -a 2 -eq 2 ]为true
    -o 或关系,在[]表达式中使用 [ 1 -eq 1 -o 2 -eq 1 ]为true

    3.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 == 2 ))为true

    [ 1 -eq 2 ] || echo yes 如果||前面表达式为false则执行后面的

    3.7 整数运算

    运算符

    描述

    + 加法
    - 减法
    * 乘法
    / 除法
    % 取余

    运算表达式

    示例

    $(()) $((1+1))
    $[] $[1+1]

    上面两个都不支持浮点运算。

    $(())表达式还有一个用途,三目运算:

    # 如果条件为真返回1,否则返回0
    # 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 "1.2+2" |bc

    echo "10^10" |bc 

    echo 'scale=2;10/3' |bc  用scale保留两位小数点

    由于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

    看到这里,想一想里面所讲的小括号、中括号的用途,是不是有点懵逼了。那我们总结一下!

    ( )

    用途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:字符串处理

  • 相关阅读:
    MySQLCluster架构图文详解
    Request.ServerVariables大全,写到这里方便查找
    如何修改表的标识列
    如何在存储过程中,调用另一存储过程的结果集
    自我简介
    第二个web网页
    第一个网页感想
    C语言I博客作业03
    ES基本搜索(1)
    ES的入门学习
  • 原文地址:https://www.cnblogs.com/521football/p/10435480.html
Copyright © 2011-2022 走看看