Bashはgrepの結果に応じて「引数が多すぎる」エラーを表示しますか?

Bashはgrepの結果に応じて「引数が多すぎる」エラーを表示しますか?

だから私はマシンにバッテリーがあることを確認してから、バッテリーの有無に応じて別のコマンドを実行しようとしています。これが私が今まで持っているものです:

upower -d >> /tmp/batstat
if [ grep -F BAT0 /tmp/batstat ]; then
    echo "BAT0 PRESENT" >> /tmp/batstat
else
    echo "NO BAT0" >> /tmp/batstat
fi

ただし、期待どおりにBAT0が/ tmp / batstatに書き込まれない場合は、「bash:[:Too Many Arguments」エラーが返されます。 grepを実行するだけでうまく動作しますが、なぜif条件で動作しないのか理解できません。

バッテリーを確認するより良い方法がある場合は、100%開いています。

答え1

if upower -d | grep -qF BAT0 ; then
   echo "BAT0 PRESENT"
else
   echo "NO BAT0"
fi

if一連のコマンドを実行し、最後のコマンド(この場合はgrep)の状態を処理します。grep一致するものがある場合はtrueを返し、そうでない場合はfalseを返します。

答え2

grep -F BAT0 /tmp/batstat確かにtest組み込まれた条件式ではありません(美しいマニュアルで詳しく説明されています)bash。の出力がgrep使用されていないため、-qオプションと依存終了コードで十分です。

grep -F -q BAT0 batstat
if [[ $? -eq 0 ]]; then
    echo yea
else
    echo nay
fi

さらに、/tmp/batstatこれは非常に間違った選択になる可能性があり、特に悪意のあるローカルユーザーがアクセスできる場合はさらにそうです。代わりに試してみてください。mktemp(1)または下にファイルが見つかりません/tmp

関連情報