zoukankan      html  css  js  c++  java
  • 03、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 -gt 1 ]为false
    -ge,greater or equal 大于等于 [ 2 -gt 1 ]为true
    -le,lesser or equal 小于等于 [ 2 -gt 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 2 ]]为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:字符串处理

  • 相关阅读:
    vim复制
    嵌入式Linux学习(二)
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1025 数的划分
    (Java实现)洛谷 P1093 奖学金
    (Java实现)洛谷 P1093 奖学金
    Java实现 洛谷 P1064 金明的预算方案
  • 原文地址:https://www.cnblogs.com/hackerlin/p/12467296.html
Copyright © 2011-2022 走看看