このスクリプトはうまく実行されます。
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
これらの間の唯一の違いは、このスクリプトの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
濃い赤の色がこうなりました。詳しくはこちらここの色は変です。。