Bashスクリプトの文字列比較の問題

Bashスクリプトの文字列比較の問題

このスクリプトはうまく実行されます。

stat1=$(systemctl list-units --type=service | grep gravity | grep gcr | awk {'print $1'} | xargs systemctl status | grep Active | awk {'print $2'})
echo "$stat1"
if [ $stat1 == 'active' ]
then
  echo " >> Gravity service is running ..."
else
  echo " >> Gravity service not running ..."
fi

これではない

stat2=$(gravity status | grep status | awk {'print $3'})
echo "$stat2"
if [ $stat2 == 'active' ]
then
  echo " >> Gravity service is running ..."
else
  echo " >> Gravity service not running ..."
fi

統計2スクリプト

これらの間の唯一の違いは、このスクリプトのstat変数への入力は白で、もう1つは緑です。また、if [[]]を使ってstat varの ''を''に変更してみましたが、どのように動作するのか理解するのに役立ちます。

これを試しました:

ここに画像の説明を入力してください。

結果は同じままです。

答え1

is-active次のクエリを使用することをお勧めします。systemctl

systemctl is-active gravity

現在のサービス状態を返すか、次の操作を行います。

sytemctl --quiet is-active gravity

0アクティブでゼロでない場合は終了します。これは、以下が利用可能であることを意味します。

if sytemctl --quiet is-active gravity; then
  echo " >> Gravity service is running ..."
else
  echo " >> Gravity service not running ..."
fi

~から手動:

アクティブモードで...

指定されたデバイスのうちアクティブな状態(つまり実行中)があることを確認してください。 1つでも有効な場合は終了コード0を返し、それ以外の場合は0以外の値を返します。 --quiet を指定しないと、現在のデバイス状態も標準出力として出力されます。


今質問自体に進みます。

緑は文字列の一部として渡されるため、一致は失敗します。これを以下と比較してみてください。

if [ "$(echo 1 | grep --color=yes 1)" = 1 ]
then echo equal
else echo different
fi
#different

if [ "$(echo 1 | grep --color=no 1)" = 1 ]
then echo equal
else echo different
fi
#equal

[ stra == strb ]テストで最初のケースがどのように異なるか、2番目のケースが同じであることを確認してください。正確に文字列を一致させます。

正規表現の一致を実行すると、この問題を回避できます。

if [[ $(echo 1 | grep --color=yes 1) =~ 1 ]]
then echo equal
else echo different
fi
#equal

ただし、正規表現はカラーコーディングと一致することがあります(ただし、「アクティブ」などの単語の場合は一致しません)。 NET[[ ]]で拡張テストがどのように必要かを確認してくださいbash

たとえば、一部のプログラムは色をパイプに渡さないほどスマートですが、grep強制的に実行することもできます。

echo 1 | grep 1 | cat -A
1$
echo 1 | grep 1 --color=yes | cat -A
^[[01;31m^[[K1^[[m^[[K$

1濃い赤の色がこうなりました。詳しくはこちらここの色は変です。

関連情報