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

(完)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM