GNU/Linux >> Linux の 問題 >  >> Linux

出力を文字列に変換する

問題の解決方法

シェル (または 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 つの単語として表示されます。


Linux
  1. Linux のシェル出力を HTML に変換するには?

  2. PS コマンドの完全な出力の表示

  3. stat コマンド出力のデバイス番号

  1. Linuxでコマンド出力をファイルに保存する方法

  2. bash のテキスト文字列を配列に変換する

  3. docker でのコマンド出力のリダイレクト

  1. コマンドの出力をシェル変数に保存しますか?

  2. ツリーコマンドの出力をJson形式に変換しますか?

  3. 「最後の」コマンドの出力?