Linux Shell基本运算符

ry Lee ◉‿◉

Shell支持以下几种运算符:

1. 算数运算符

提示

原生bash不支持算数运算,但是可以通过其他命令来实现,例如awkexprexpr最常用。
expr是一个表达式计算工具,使用它能完成表达式的求值操作。

1
2
val=`expr 2 + 2`
echo "两数之和为 : $val"

注意

</div>
<div class="notel-content">
  <ol>
  • 运算符+两侧的空格不能少;
  • `是反引号,而不是单引号',这个按键是键盘主键盘区Esc按键下方的~
  • 乘法运算中,*前要添加反斜杠\
  • </div>
    
    运算符 说明 举例
    + 加法 `expr $a + $b`
    - 减法 `expr $a - $b`
    * 乘法 `expr $a \* $b`
    / 取商。例如 5 / 2 的结果为2 `expr $a / $b`
    % 取余。例如 5 / 2 的结果为1 `expr $a % $b`
    = 赋值 a=$b
    == 相等。比较两个数字,相等则返回true [ $a == $b ]
    != 不等。比较两个数字,不等则返回true [ $a != $b ]

    示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #!/bin/bash

    a=10
    b=20

    val=`expr $a + $b`
    echo "a + b : $val"

    val=`expr $a - $b`
    echo "a - b : $val"

    val=`expr $a \* $b`
    echo "a * b : $val"

    val=`expr $b / $a`
    echo "b / a : $val"

    val=`expr $b % $a`
    echo "b % a : $val"

    if [ $a == $b ]; then
    echo "a 等于 b"
    fi

    if [ $a != $b ]; then
    echo "a 不等于 b"
    fi

    执行以上脚本,输出的结果如下:

    1
    2
    3
    4
    5
    6
    a + b : 30
    a - b : -10
    a * b : 200
    b / a : 2
    b % a : 0
    a 不等于 b

    2. 关系运算符

    提示

    关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

    运算符 说明 举例
    -eq 相等 [ $a -eq $b ]
    -ne 不等 [ $a -ne $b ]
    -gt 大于 [ $a -gt $b ]
    -ge 大于等于 [ $a -ge $b ]
    -lt 小于 [ $a -lt $b ]
    -le 小于等于 [ $a -le $b ]

    示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #!/bin/bash

    a=10
    b=20

    if [ $a -eq $b ]; then
    echo "$a -eq $b : a 等于 b"
    else
    echo "$a -eq $b: a 不等于 b"
    fi

    if [ $a -ne $b ]; then
    echo "$a -ne $b: a 不等于 b"
    else
    echo "$a -ne $b : a 等于 b"
    fi

    if [ $a -gt $b ]; then
    echo "$a -gt $b: a 大于 b"
    else
    echo "$a -gt $b: a 不大于 b"
    fi

    if [ $a -lt $b ]; then
    echo "$a -lt $b: a 小于 b"
    else
    echo "$a -lt $b: a 不小于 b"
    fi

    if [ $a -ge $b ]; then
    echo "$a -ge $b: a 大于或等于 b"
    else
    echo "$a -ge $b: a 小于 b"
    fi

    if [ $a -le $b ]; then
    echo "$a -le $b: a 小于或等于 b"
    else
    echo "$a -le $b: a 大于 b"
    fi

    输出结果:

    1
    2
    3
    4
    5
    6
    10 -eq 20: a 不等于 b
    10 -ne 20: a 不等于 b
    10 -gt 20: a 不大于 b
    10 -lt 20: a 小于 b
    10 -ge 20: a 小于 b
    10 -le 20: a 小于或等于 b

    3. 布尔运算符

    运算符 说明 举例
    ! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ]
    -o或者|| 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ]
    -a或者&& 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ]

    示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #!/bin/bash

    a=10
    b=20

    if [ $a != $b ]; then
    echo "$a != $b : a 不等于 b"
    else
    echo "$a == $b: a 等于 b"
    fi

    if [ $a -lt 100 -a $b -gt 15 ]; then
    echo "$a 小于 100 且 $b 大于 15 : 返回 true"
    else
    echo "$a 小于 100 且 $b 大于 15 : 返回 false"
    fi

    if [ $a -lt 100 -o $b -gt 100 ]; then
    echo "$a 小于 100 或 $b 大于 100 : 返回 true"
    else
    echo "$a 小于 100 或 $b 大于 100 : 返回 false"
    fi

    if [ $a -lt 5 -o $b -gt 100 ]; then
    echo "$a 小于 5 或 $b 大于 100 : 返回 true"
    else
    echo "$a 小于 5 或 $b 大于 100 : 返回 false"
    fi

    if [[ $a -lt 100 && $b -gt 100 ]]; then
    echo "返回 true"
    else
    echo "返回 false"
    fi

    if [[ $a -lt 100 || $b -gt 100 ]]; then
    echo "返回 true"
    else
    echo "返回 false"
    fi

    输出结果:

    1
    2
    3
    4
    5
    6
    10 != 20 : a 不等于 b
    10 小于 100 且 20 大于 15 : 返回 true
    10 小于 100 或 20 大于 100 : 返回 true
    10 小于 5 或 20 大于 100 : 返回 false
    10 小于 100 且 20 大于 100 : 返回 false
    10 小于 100 或 20 大于 100 : 返回 true

    4. 字符串运算符

    运算符 说明 举例
    = 检测两个字符串是否相等,相等返回 true。 [ $a = $b ]
    != 检测两个字符串是否不相等,不相等返回 true。 [ $a != $b ]
    -z 检测字符串长度是否为0,为0返回 true。 [ -z $a ]
    -n 检测字符串长度是否不为 0,不为 0 [ -n "$a" ]
    $ 检测字符串是否不为空,不为空返回 true。 [ $a ]

    示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #!/bin/bash

    a="abc"
    b="efg"

    if [ $a = $b ]; then
    echo "$a = $b : a 等于 b"
    else
    echo "$a = $b: a 不等于 b"
    fi

    if [ $a != $b ]; then
    echo "$a != $b : a 不等于 b"
    else
    echo "$a != $b: a 等于 b"
    fi

    if [ -z $a ]; then
    echo "-z $a : 字符串长度为 0"
    else
    echo "-z $a : 字符串长度不为 0"
    fi

    if [ -n "$a" ]; then
    echo "-n $a : 字符串长度不为 0"
    else
    echo "-n $a : 字符串长度为 0"
    fi

    if [ $a ]; then
    echo "$a : 字符串不为空"
    else
    echo "$a : 字符串为空"
    fi

    输出结果:

    1
    2
    3
    4
    5
    abc = efg: a 不等于 b
    abc != efg : a 不等于 b
    -z abc : 字符串长度不为 0
    -n abc : 字符串长度不为 0
    abc : 字符串不为空

    5. 文件测试运算符

    操作符 说明 举例
    -b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ]
    -c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ]
    -d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ]
    -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ]
    -g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ]
    -k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ]
    -p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ]
    -u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ]
    -r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ]
    -w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ]
    -x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ]
    -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ]
    -e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ]
    -S file 检测文件是否为socket,如果是,则返回 true。 [ -S $file ]
    -L file 检测文件是否存在并且是一个符号链接,如果是,则返回 true。 [ -L $file ]

    示例代码:

    变量file表示文件~/test.sh,它的大小为 100 字节,具有 rwx 权限。下面的代码,将检测该文件的各种属性:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #!/bin/bash

    file="~/test.sh"
    if [ -r $file ]; then
    echo "文件可读"
    else
    echo "文件不可读"
    fi

    if [ -w $file ]; then
    echo "文件可写"
    else
    echo "文件不可写"
    fi

    if [ -x $file ]; then
    echo "文件可执行"
    else
    echo "文件不可执行"
    fi

    if [ -f $file ]; then
    echo "文件为普通文件"
    else
    echo "文件为特殊文件"
    fi

    if [ -d $file ]; then
    echo "文件是个目录"
    else
    echo "文件不是个目录"
    fi

    if [ -s $file ]; then
    echo "文件不为空"
    else
    echo "文件为空"
    fi

    if [ -e $file ]; then
    echo "文件存在"
    else
    echo "文件不存在"
    fi

    if [ -S $file ]; then
    echo "文件是socket"
    else
    echo "文件不是socket"
    fi

    if [ -L $file ]; then
    echo "文件存在,且是一个软连接"
    else
    echo "文件不存在或是文件存在但不是一个软连接"
    fi

    输出结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    文件不可读
    文件不可写
    文件不可执行
    文件为特殊文件
    文件不是个目录
    文件为空
    文件不存在
    文件不是socket
    文件不存在或是文件存在但不是一个软连接
    • 标题: Linux Shell基本运算符
    • 作者: ry Lee
    • 创建于 : 2023-04-06 09:35:41
    • 更新于 : 2023-11-28 12:17:56
    • 链接: https://blog.rylee.fun/2023/04/06/linux-shell-basic-operators/
    • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
     评论