3

bash スクリプトの if ステートメントに問題があります。目標: の値を確認する必要がありますがclustered、一意の名前ではないため、文字列全体を照合することにしました。たとえば、clusteredここで真/偽かどうかを調べるifには、 は「隣接する」文字列全体を探します。

問題:if以下のステートメントは一部の文字列では正常に機能しますが、実際には以下の値では機能しません。周りの二重引用符が原因だと思い"false"ます。

これを変更して機能させることはできifますか (つまり、追加の二重引用符を受け入れますか)?

私のバッシュ:

if grep -Fxq "<cache clustered="false" " confg.xml
then
    echo "Correct value"
    # code if found
else
    echo "Incorrect value"
    # code if not found
fi

ありがとうございました、

4

2 に答える 2

2

問題は、文字列自体だけでなく、grep 対象の文字列を二重引用符で囲んでいることです。Bash は、最後の二重引用符ではなく、次の二重引用符と各二重引用符を照合することによって、引用符を解釈します。引用符が括弧である場合、最初の行は、if grep -Fxq (<cache clustered=)false( ) confg.xml本当に必要なものがif grep -Fxq (<cache clustered=(false) ) confg.xml. つまり、内部の二重引用符は、文字通りの二重引用符として解釈されません。文字どおりに解釈する場合は、grep 式を二重引用符ではなく単一引用符で囲みます。

if grep -Fxq '<cache clustered="false" ' confg.xml
于 2013-04-10T04:41:10.380 に答える
1

これを試してみましたが、うまくいくようです

bash$ cat log; if grep -Fxq "<cache clustered=\"false\"" log ; then echo "got it"; else echo "missed"; fi
<cache clustered="false"
got it

内側の二重引用符は、リテラルとして解釈する必要があります。したがって、それらの前のバックスラッシュは、文字列の開始または終了ではないことを bash に通知します

于 2013-04-10T06:04:13.290 に答える