10

Web ページに指定された文字列が含まれているかどうかを確認する簡単なスクリプトがあります。次のようになります。

#!/bin/bash
res=`curl -s "http://www.google.com" | grep "foo bar foo bar" | wc -l`
if [[ $res == "0" ]]; then
    echo "OK"
else
    echo "Wrong"
fi

ご覧のとおり、「OK」を取得しようとしていますが、「間違っています」。

どうしたの?

if [ $res == "0" ] を使用すると、機能します。res= の代わりに res="0" を使用するだけcurl...でも、目的の結果を得ることができます。

なぜこれらの違いがあるのですか?

4

2 に答える 2

22

res次のものが含まれていることがわかります。echo "Wrong: res=>$res<"

一部のテキストに他のテキストが含まれているかどうかを確認したい場合は、grep 出力の長さを確認する必要はありません。grep の戻りコードを確認する必要があります。

string="foo bar foo bar"
if curl -s "http://www.google.com" | grep -q "$string"; then
    echo "'$string' found"
else
    echo "'$string' not found"
fi

またはgrepなしでも:

text=$(curl -s "$url")
string="foo bar foo bar"
if [[ $text == *"$string"* ]]; then
    echo "'$string' found"
else
    echo "'$string' not found in text:"
    echo "$text"
fi
于 2012-09-16T10:17:48.283 に答える
0

グレン・ジャックマンのヘルプで答えを見つけました。

この質問で次の点が得られます。

  • wc -lの出力には空白が含まれています。
  • echo "$var"の代わりにデバッグするecho $var
  • [[var 内のすべての文字のリテラル値を保持します。
  • [実行する前に var をその値に展開します。これは [ が実際にはtestcmd であるため、シェル展開の規則に従うためです。
于 2012-09-19T03:39:50.950 に答える