zoukankan      html  css  js  c++  java
  • bash shell 判断变量是否在列表中

    1. 背景

    最近在跟一个AI的项目,代码量很少,于是写了个脚本,想用scp直接复制到生产,但是有一些文件需要排除掉。

    2. 双中括号关键字

    双中括号[[]]是bash shell中的关键词,相对于[]有以下特点和优势:

    • [[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
    • 支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
    • 使用[[ ... ]]条件判断结构,而不是[... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。
    • bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

    实际上,原理就是,在双中括号中,可以使用=~进行shell的正则匹配,找出右边的字符串是否在左边的字符串中。

    但是需要注意的是,双中括号在bash中可以使用,在sh中会报找不到的错,这也是我使用的时候遇到的一个坑。

    3. 例子

    譬如,需要判断文件是否不在列表中

    #!/bin/bash
    # 判断文件是否不在列表中
    src_dir=/test/dir
    exclude_files="a.py b.py c.ini"
    
    for file in $src_dir/*
    do 
        sname=$(basename $file)
        if ! [[ "$exclude_files" =~ "$sname" ]]
        then
            echo "file not in $sname"
        fi 
    done

    或者更简化的例子,判断字符串是否包含另外一个字符串:

    #!/bin/bash
    string="abcdefg"
    if [[ "$string" =~ "abc" ]];then
      echo "match..."
    else
      echo "not match.."
    fi

    结果输出match…

    4. 参考

    (1) BASH 中单括号和双括号

    (2) 如何判断一个变量是否包含在数组里面 判断shell数组中是否存在某个值

    (完)

  • 相关阅读:
    2017 9 26
    NOI2002 银河英雄传说(luogu p1196)
    luogu [USACO08OCT]打井Watering Hole
    luogu P2784 化学1(chem1)- 化学合成
    2017 9 24
    2017.9.24 noip模拟赛 day2—组合数
    Java 接口——2
    Java 接口——1
    Java 泛型
    Java 随笔——8
  • 原文地址:https://www.cnblogs.com/harrymore/p/12162054.html
Copyright © 2011-2022 走看看