• shell中的条件判断


    【原文链接】shell中的条件判断

    1 基本语法

    [ condition ] 这里需要注意的是condition前后要有一个空格,条件非空即为true,比如 [ xxx ] 返回true,[] 则返回 false

    2 常用判断条件

    (1) 两个整数之间比较

    • = 字符串比较
    • -lt 小于
    • -le 小于等于
    • -eq 等于
    • -gt 大于等于
    • -ne 不等于

    (2) 按照文件权限进行判断

    • -r 有读的权限(read)
    • -w 有写的权限(write)
    • -x 有执行权限(execute)
      (3) 按照文件类型进行判断
    • -f 文件存在并且是一个常规的文件
    • -e 文件存在
    • -d 文件存在并是一个目录

    3 条件判断使用举例

    (1) 比较两个数的大小,如下,当返回值为0为true,否则当返回值为1则为false,此外,当放括号与数字之间必须要有空格

    # 条件两边没有空格会报错
    $ [3 -gt 2]
    -bash: [3: command not found
    
    # 条件 3大于2
    $ [ 3 -gt 2 ]
    # 打印上一条命令返回码
    $ echo $?
    0
    
    # 作为字符串比较 3等于2
    $ [ 3 = 2 ]
    # 打印上一条语句返回码
    $ echo $?
    1
    
    # 比较 3小于2
    $ [ 3 -lt 2 ]
    # 打印上一条语句返回码
    $ echo $?
    1
    
    # 比较,3不等于2
    $ [ 3 -ne 2 ]
    # 打印上一条语句返回码
    $ echo $?
    0
    
    # 比较 3等于2
    $ [ 3 -eq 3 ]
    # 打印上一条语句返回码
    $ echo $?
    0
    $
    
    • 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

    (2) 判断文件是否存在以及类型

    $ mkdir demo
    $ ls
    demo  test.sh
    
    # 判断 test.sh为文件
    $ [ -f test.sh ]
    $ echo $?
    0
    
    # 判断demo为目录
    $ [ -d demo ]
    $ echo $?
    0
    
    # 判断test.sh为目录
    $ [ -d test.sh ]
    $ echo $?
    1
    
    # 判断demo为文件
    $ [ -f demo ]
    $ echo $?
    1
    
    # 判断test.sh存在
    $ [ -e test.sh ]
    $ echo $?
    0
    
    # 判断demo存在
    $ [ -e demo ]
    $ echo $?
    0
    
    # 判断hahaha存在
    $ [ -e hahahaha ]
    $ echo $?
    1
    $
    
    • 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

    (3) 判断文件权限的条件,如下

    $ ls -l
    total 4
    drwxrwxr-x. 2 honghua honghua  6 Jul  7 13:23 demo
    -rw-rw-r--. 1 honghua honghua 21 Jul  6 16:52 test.sh
    
    # 判断test.sh有读权限
    $ [ -r test.sh ]
    $ echo $?
    0
    
    # 判断demo有写的权限
    $ [ -w demo ]
    $ echo $?
    0
    
    # 判断test.sh有可执行权限
    $ [ -x test.sh ]
    $ echo $?
    1
    
    # 判断demo有可执行权限
    $ [ -x demo ]
    $ echo $?
    0
    $
    
    • 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

    4 多条条件判断语句的逻辑关系

    • && 表示前一条命令执行成功时,才执行后一条命令,如果前一条命令失败了,则不会执行后一条命令
    • || 表示上一条命令执行失败时,才执行下一条命令,如果前一条命令成功了,则不会执行后一套命令

    如下,其中test.sh为文件,demo为目录

    # 首先判断3大于2,为True,继续判断test.sh存在,也为True,因此返回码为0
    $ [ 3 -gt 2 ] && [ -f test.sh ]
    $ echo $?
    0
    
    # 首先判断test.sh存在,为True,然后判断test.sh拥有可执行权限,为False,因此返回码为1
    $ [ -e test.sh ] && [ -x test.sh ]
    $ echo $?
    1
    
    # 首先判断test.sh是目录,为False,因为逻辑为或,所以继续判断demo是目录,为True,所以返回码为0
    $ [ -d test.sh ] || [ -d demo ]
    $ echo $?
    0
    $
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    获取ArcGISPro中conda信息详情
    Netfilter之连接跟踪(Connection Tracking)和反向 SNAT(Reverse SNAT)
    使用 Learner Lab - 在 Lambda 建立 Pillow 层,进行 S3 的图片镜相操作
    php lcg_value与mt_rand生成0~1随机小数的效果比较
    Linux服务器 james邮箱服务器搭建 (附java测试Demo)
    Nvidia GPU 入门教程之 11 数据中心 GPU 的对决:A100 与 V100S
    vue项目created()被调用多次的坑
    Django Celery异步任务队列
    程序员如何写游戏搞钱?
    基于springboot的宠物商城网站
  • 原文地址:https://blog.csdn.net/redrose2100/article/details/127898703