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數組中是否存在某個值
(完)