grep 結果に基づく Bash で「引数が多すぎます」というエラーが発生しますか?

grep 結果に基づく Bash で「引数が多すぎます」というエラーが発生しますか?

そこで、マシンにバッテリーがあるかどうかを確認し、バッテリーがあるかどうかに応じてさまざまなコマンドを実行しようとしています。これまでのところ、次のようになっています。

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

しかし、これは予想どおりに NO 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/batstattestは、組み込みの の条件式 (詳細なマニュアルに記載されているとおり) ではありませんbash。 の出力はgrep使用されない為、-q終了コードに依存するオプションと で十分でしょう。

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

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

関連情報