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