grepが何かを返すかどうかを確認する1つのライナー? [コピー]

grepが何かを返すかどうかを確認する1つのライナー? [コピー]

デバイスがThinkPadであるか、次のものを使用していないことを確認します。

sudo dmidecode | grep ThinkPad

最終結果がtrueまたはfalse(または1/0)を返すことを望みます。

私の考えの解決策は次のとおりです。

sudo dmidecode | grep -c ThinkPad | test xargs -gt 0

xargsしかし、ここでは正しく使用する方法がわかりません。

答え1

後に終了ステータスチェックを追加すると、デフォルトではgrep常にパイプラインの最後のコマンドから終了ステータスが取得されます。

sudo dmidecode | grep -q ThinkPad; echo $?

終了状態にのみ関心があるため、出力-qを抑制するために使用されます。grep


必要に応じてコマンドのグループ化を使用できますが、ここでは少し冗長です。

sudo dmidecode | { grep -q ThinkPad; echo $? ;}

答え2

チェックでシェルスクリプトを使用する場合は、ifheemaylの提案に従ってください-q

if sudo dmidecode | grep -q Thinkpad
then
    echo "I'm a Thinkpad"
fi

このifブロックはコマンドの終了状態をチェックするので、終了状態を印刷して他のものと比較するgrepのではなく、終了状態に直接依存することができます。$?

答え3

からインスピレーションを受けるヒムメルの答え:

sudo dmidecode | grep -q ThinkPad && echo true || echo false

grepがThinkPadを見つけた場合はtrueを返し、そうでない場合はfalseを返します。

答え4

sudo dmidecode | grep -c ThinkPad | xargs test 0 -lt

必要な結果を得るには、xargsコマンドとそのオペランドを並べ替える必要があります。test0以外(> 0)ThinkPadが行を構成している場合はtrueを返します。

または、テストコマンドのオペランドの順序を維持するには、次のようにします。

sudo dmidecode | grep -c ThinkPad | xargs -I \{\} test \{\} -gt 0

次に、両方のコマンドで$?次のように変数値を調べて、grep成功/失敗の運命を決定します。

if sudo dmidecode | grep -c ThinkPad | xargs -I \{\} test \{\} -gt 0; then
   echo "success hooray!"
else 
   echo nothing
fi

関連情報