簡體   English   中英

如何比較Bash中的字符串

[英]How to compare strings in Bash

如何將變量與字符串進行比較(如果它們匹配則執行某些操作)?

在 if 語句中使用變量

if [ "$x" = "valid" ]; then
  echo "x has the value 'valid'"
fi

如果您想在它們不匹配時執行某些操作,請將=替換= != 您可以在各自的文檔中閱讀有關字符串運算算術運算的更多信息。

為什么我們在$x周圍使用引號?

您需要$x周圍的引號,因為如果它為空,您的 Bash 腳本會遇到如下所示的語法錯誤:

if [ = "valid" ]; then

==運算符的非標准使用

請注意,Bash 允許==用於與[相等,但這不是標准的

使用第一種情況,其中$x周圍的引號是可選的:

if [[ "$x" == "valid" ]]; then

或使用第二種情況:

if [ "$x" = "valid" ]; then

或者,如果您不需要else子句:

[ "$x" == "valid" ] && echo "x has the value 'valid'"
a="abc"
b="def"

# Equality Comparison
if [ "$a" == "$b" ]; then
    echo "Strings match"
else
    echo "Strings don't match"
fi

# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
    echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
    echo "$b is lexicographically smaller than $a"
else
    echo "Strings are equal"
fi

筆記:

  1. if[]之間的空格很重要
  2. ><是重定向運算符,因此對於字符串,分別使用\\>\\<將其轉義。

要將字符串與通配符進行比較,請使用:

if [[ "$stringA" == *$stringB* ]]; then
  # Do something here
else
  # Do something here
fi

我不得不在一點上不同意其中一條評論:

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

不,那不是瘋狂的單線

它只是看起來像一個,嗯,外行......

在某種程度上,它使用通用模式作為一種語言;

在你學會了語言之后。

其實讀起來很舒服

它是一個簡單的邏輯表達式,有一個特殊的部分:邏輯運算符的惰性求值。

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

每個部分都是一個邏輯表達式; 第一個可能是真的或假的,其他兩個總是真的。

(
[ "$x" == "valid" ] 
&&
echo "valid"
)
||
echo "invalid"

現在,當它被評估時,第一個被檢查。 如果為假,則邏輯的第二個操作數它之后的&&不相關。 第一個不是真的,所以無論如何它不可能是第一個,第二個是真的。
現在,在這種情況下是邏輯的第一面|| 錯誤,但如果另一方(第三部分)為真,則可能為真。

因此將評估第三部分 - 主要是將消息作為副作用編寫。 (它的結果為0為真,我們在這里不使用)

其他情況類似,但更簡單 - 而且 - 我保證! 是 - 可以 - 易於閱讀!
(我沒有,但我認為作為一名留着灰胡子的 UNIX 老手對此有很大幫助。)

以下腳本逐行讀取名為“testonthis”的文件,然后將每一行與一個簡單字符串、一個包含特殊字符的字符串和一個正則表達式進行比較。 如果不匹配,則腳本將打印該行,否則不打印。

Bash 中的空間非常重要。 所以以下將起作用:

[ "$LINE" != "table_name" ] 

但以下不會:

["$LINE" != "table_name"] 

所以請按原樣使用:

cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done

您還可以使用用/ esac

case "$string" in
 "$pattern" ) echo "found";;
esac

如果輸入只有幾個有效條目,我可能會使用正則表達式匹配。 例如,只有“開始”和“停止”是有效的動作。

if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
  echo "valid action"
fi

請注意,我使用雙逗號將變量$ACTION小寫。 另請注意,這不適用於過時的 bash 版本。

Bash 4+ 示例。 注意:當單詞包含空格等時,不使用引號會導致問題。在 IMO 中始終引用 Bash。

以下是 Bash 4+ 中的一些示例:

示例 1,檢查字符串中的 'yes'(不區分大小寫):

    if [[ "${str,,}" == *"yes"* ]] ;then

示例 2,檢查字符串中的 'yes'(不區分大小寫):

    if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then

示例 3,檢查字符串中的 'yes'(區分大小寫):

     if [[ "${str}" == *"yes"* ]] ;then

示例 4,檢查字符串中的 'yes'(區分大小寫):

     if [[ "${str}" =~ "yes" ]] ;then

示例 5,完全匹配(區分大小寫):

     if [[ "${str}" == "yes" ]] ;then

示例 6,完全匹配(不區分大小寫):

     if [[ "${str,,}" == "yes" ]] ;then

例7,完全匹配:

     if [ "$a" = "$b" ] ;then

享受。

我是這樣做的,與 Bash 和Dash (sh) 兼容:

testOutput="my test"
pattern="my"

case $testOutput in (*"$pattern"*)
    echo "if there is a match"
    exit 1
    ;;
(*)
   ! echo there is no coincidence!
;;esac
if [ $VAR= "TEST" ]; then
    echo "variable VAR matches with string TEST"
else
    echo "VAR does not match with the string TEST"
fi

你有比較問題嗎? (如下圖?)

var="true"
if [[ $var == "true" ]]; then
  # It should be working, but it is not...
else
  # It is falling here...
fi

嘗試使用=~運算符(正則表達式運算符),它可能會起作用:

var="true"
if [[ $var =~ "true" ]];then
  # Now it works here!!
else
  # No more inequality
fi

我在同樣的情況下苦苦掙扎了一段時間,這是我可以解決的方法:

   if [ "$var1" == "$var2" ]; then
      #dowhateveryouwant
    fi
  

注意比較符號前后的空格,否則它不會起作用或者會給你意想不到的結果。

我花了很多時間在使用一個等號 (=) 上,但沒有用。 我希望它能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM