如何在 Linux 上判斷 Bash 字符串是否包含子字符串

已發表: 2022-09-21
顯示 bash 提示符的 Linux 筆記本電腦
fatmawati achmad zaenuri/Shutterstock.com

有時在 Linux 腳本中,您想知道文本字符串是否包含特定的較小字符串。 有很多方法可以做到這一點。 我們向您展示了一些簡單、可靠的技術。

為什麼這有用?

在字符串中搜索較小的子字符串是一項常見要求。 一個示例是從文件或人工輸入中讀取文本並在字符串中搜索特定子字符串,以便您的腳本可以決定下一步該做什麼。 它可能會在配置文件中查找標籤或設備名稱,或者在用戶的輸入行中查找命令字符串。

Linux 用戶有幸擁有許多用於處理文本的實用程序。 有些內置在 Bash shell 中,有些則作為獨立的實用程序或應用程序提供。 Unix 衍生的操作系統提供豐富的字符串操作功能是有原因的。

如何在 Linux 上的 Bash 中操作字符串
相關如何在 Linux 上的 Bash 中操作字符串

有些看起來是文件的東西並不是簡單的文件。 它們是表示硬件設備和系統信息源等內容的特殊文件。 操作系統執行的抽象賦予它們文件的外觀和特徵。 您可以從它們中讀取信息——自然是文本——並且在某些情況下寫入它們,但它們不是普通文件。

文本還用作終端窗口中命令的輸入和輸出。 這允許輸入和輸出的重定向和管道。 該功能支持將 Linux 命令序列鏈接在一起的能力,將一個命令的輸出作為輸入傳遞給下一個命令。

無論其來源如何,在我們收到的文本中搜索重要的單詞、命令、標籤或其他指示符是處理基於文本的數據的標準部分。 以下是您可以在自己的腳本中包含的一系列簡單技術。

使用 Bash Builtins 查找子字符串

雙括號“ [[...]] ”字符串比較測試可用於if語句中,以確定一個字符串是否包含另一個字符串。

將此腳本複製到編輯器中,並將其保存到名為“double.sh”的文件中。

 #!/bin/bash

如果 [[ “猴子” = *“鑰匙”* ]]; 然後
  echo "鑰匙在猴子裡"
別的
  echo "key不在monkey中"
菲
如何在 Linux 中使用雙括號條件測試
相關如何在 Linux 中使用雙括號條件測試

您需要使用chmod命令使腳本可執行。 這是使任何腳本可執行的始終必需的步驟。 每次創建腳本文件時都需要這樣做。 在每種情況下替換相應腳本的名稱。

 chmod +x 雙倍.sh 

使用 chmod 使腳本可執行

讓我們運行腳​​本。

 ./double.sh 

運行 double.sh 腳本

這是因為星號“ * ”代表任何字符序列,包括無字符。 如果子字符串“key”位於目標字符串中,無論其前後是否有任何字符,測試都將返回 true。

在我們的示例中,子字符串前面有字符。 這些由第一個星號匹配。 子字符串後面沒有字母,但是,因為星號也不匹配任何字符,所以測試仍然通過。

為了靈活性,我們可以修改我們的腳本來處理變量而不是文字字符串。 這是腳本“double2.sh”。

 #!/bin/bash

字符串="猴子"
子串=“鍵”

如果 [[ $string = *$substring* ]]; 然後
  echo "$substring 在 $string 中找到"
別的
  echo "$substring 在 $string 中沒有找到"
菲

讓我們看看它是如何運行的。

 ./double2.sh 

運行 double2.sh 腳本

這以相同的方式工作,優點是我們可以使用變量名而不是文字字符串。 將我們的小解決方案變成一個函數將提供最大的靈活性。

這是腳本“double3.sh”。

 #!/bin/bash

shopt -s nocasematch

字符串="猴子"
子串=“鍵”
首都=“倫敦”

check_substring ()
{
如果 [[ $1 = *$2* ]]; 然後
  echo "在 $1 中找到 $2"
別的
  echo "$1 中未找到 $2"
菲
}

check_substring "猴子" "鑰匙" 
check_substring $string $substring
check_substring $string "香蕉"
check_substring "威爾士" $capital

我們使用變量和文字字符串的混合來調用我們的check_substring函數。 我們使用shopt及其-s (set) 選項來設置nocasematch ,以使匹配不區分大小寫。

這是它的運行方式。

 ./double3.sh 

運行 double3.sh 腳本

我們也可以在case語句中使用將子字符串包裝在星號中的技巧。 這是“case.sh”。

 #!/bin/bash

shopt -s nocasematch

字符串="小袋鼠"
子串=“牆”

案例$字符串在

  *$子字符串*)
    echo "$substring 在 $string 中找到"
    ;;

  *)
    echo "沒有匹配:$string"
    ;;
經社理事會

使用case語句而不是很長的if語句可以使腳本更易於閱讀和調試。 如果您需要檢查一個字符串是否包含許多可能的子字符串之一,那麼case語句將是最佳選擇。

 ./case.sh 

運行 case.sh 腳本

找到子字符串。

使用 grep 查找子字符串

除了 Bash 內置程序之外,您可能會使用的第一個文本搜索工具是grep 。 我們可以使用grep在字符串中搜索字符串的先天能力來查找我們的子字符串。

該腳本稱為“subgrep.sh”。

 #!/bin/bash

string="粥鍋"
子串="山脊"

if $(echo $string | grep -q $substring); 然後
  echo "$substring 在 $string 中找到"
別的
  echo "$substring 在 $string 中沒有找到"
菲

該腳本使用echo將字符串發送到grep ,後者搜索子字符串。 我們使用-q (安靜)選項來停止grep將任何內容寫入標準輸出。

如何在 Linux 上使用 grep 命令
相關如何在 Linux 上使用 grep 命令

如果括號“ (...) ”內的命令結果為零,則表示找到了匹配項。 因為在 Bash 中零等於true ,所以滿足if語句並執行then子句。

讓我們看看它的輸出是什麼。

 ./subgrep.sh 

運行 subgrep.sh 腳本

使用 sed 查找子字符串

我們也可以使用sed來查找子字符串。

默認情況下, sed會打印輸入其中的所有文本。 使用sed -n可以防止這種情況。 唯一打印的行是匹配行。 此表達式將打印任何匹配或包含 $substring 值的行。

 "/$substring/p"

我們使用這裡的重定向將$string的值輸入到sed中, <<< 。 這用於將值重定向到當前 shell 中的命令。 它不會像管道那樣調用子shell。

如何在 Linux 上使用 sed 命令
相關如何在 Linux 上使用 sed 命令

第一個-n是測試。 如果sed命令的輸出非零,它將返回truesed的輸出可以是非零的唯一方法是找到匹配的行。 如果是這種情況,則必須在$string中找到$substring

這是“subsed.sh”。

 #!/bin/bash

字符串="瑞典"
子串=“伊甸園”

if [ -n "$(sed -n "/$substring/p" <<< $string)" ]; 然後
  echo "$substring 在 $string 中找到"
別的
  echo "$substring 在 $string 中沒有找到"
菲

當我們運行腳​​本時,我們得到了預期的響應。

 ./subsed.sh 

運行 subsed.sh 腳本

我們可以通過編輯$substring的值來測試腳本的邏輯,這樣比較失敗。

./subsed.sh

使用不匹配的子字符串運行 subsed.sh 腳本

停止搜索,找到它

其他工具可以找到子字符串,例如awkPerl ,但是像查找子字符串這樣的簡單用例並不能保證它們的額外功能或增加的複雜性。 特別是,使用 Bash 內置搜索子字符串快速、簡單且不需要外部工具。

相關:如何在 Bash 腳本中使用案例語句