問題の解決方法
シェル (または test
コマンド) は =
を使用します 文字列の等価性と -eq
の場合 数値の等価性。シェルの一部のバージョンは ==
をサポートしています =
の同義語として (しかし =
POSIX test
で定義されています 指図)。対照的に、Perl は ==
を使用します。 数値の等価性と eq
の場合 文字列の等価性。
また、いずれかのテスト コマンドを使用する必要があります:
if [ "$a" = "AC adapter : online" ]
then echo "ONLINE"
else echo "OFFLINE"
fi
または:
if [[ "$a" = "AC adapter : online" ]]
then echo "ONLINE"
else echo "OFFLINE"
fi
[[
で 演算子、"$a"
の周りの引用符を削除できます .
エラー メッセージが表示される理由
あなたが書いた時:
if $a -eq "AC adapter : online"
シェルはそれを次のように展開しました:
if AC adapter : online -eq "AC adapter : online"
これはコマンド AC
を実行するリクエストです 表示されている 5 つの引数を使用して、コマンドの終了ステータスを 0 と比較します (0 — 成功 — を true と見なし、ゼロ以外のものを false と見なします)。明らかに、AC
というコマンドはありません。 あなたのシステム上で (これはそれほど驚くべきことではありません)。
これは、次のように記述できることを意味します:
if grep -q -e 'some.complex*pattern' $files
then echo The pattern was found in some of the files
else echo The pattern was not found in any of the files
fi
文字列をテストしたい場合は、test
を使用する必要があります コマンドまたは [[ ... ]]
オペレーター。 test
コマンドは [
と同じです コマンド名が [
の場合を除く 、最後の引数は ]
でなければなりません .
比較を角括弧で囲み、$a
を二重引用符で囲みます :
if [ "$a" == "AC adapter : online" ]; then
...
角括弧なし bash
式を実行して戻り値を評価しようとします。
コマンド置換を二重引用符で囲むことも良い考えです:
a="$(acpitool -a)"
これを試してください -
#!/bin/bash
a="$(acpitool -a)"
echo "$a"
if [ "$a" == 'AC adapter : online' ]
then
echo "ONLINE"
else
echo "OFFLINE"
fi
説明: -eq
主に整数式の等価性に使用されます。だから、==が行く方法です!また、単語の分割を防ぐために、$a または $(acpitool -a) を二重引用符で囲みます。二重引用符で囲まれた引数は、空白区切りが含まれていても、1 つの単語として表示されます。