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数组中是否存在某个值

(完)

posted @ 2020-01-07 16:00  大师兄啊哈  阅读(10945)  评论(0编辑  收藏  举报