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 변수에 대한 입력은 흰색이고 다른 하나는 녹색이라는 것입니다. 또한 if [[ ]]를 사용하고 stat var의 ''를 ""로 변경해 보았지만 작동 방법을 이해하도록 도와주세요.

이것을 시도했습니다 :

여기에 이미지 설명을 입력하세요.

결과는 동일하게 유지됩니다.

답변1

is-active다음 쿼리 를 사용하는 것이 좋습니다.systemctl

systemctl is-active gravity

현재 서비스 상태를 반환하거나 다음을 수행합니다.

sytemctl --quiet is-active gravity

0활성 상태이고 0이 아닌 경우 종료합니다. 이는 다음을 사용할 수 있음을 의미합니다.

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

~에서수동:

활성 모드에서...

지정된 장치 중 활성 상태(즉, 실행 중)가 있는지 확인합니다. 하나라도 활성화되어 있으면 종료 코드 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 ]테스트를 통해 첫 번째 사례가 어떻게 다른지, 두 번째 사례가 동일한지 확인하세요.정확히문자열을 일치시킵니다.

정규식 일치를 수행하면 이 문제를 피할 수 있습니다.

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

그러나 정규식은 색상 코딩과 일치할 수 있습니다(그러나 "active"와 같은 단어의 경우에는 일치하지 않음). NET [[ ]]에서 확장된 테스트가 어떻게 필요한지 참고하세요 bash.

예를 들어 일부 프로그램은 색상을 파이프에 전달하지 않을 만큼 똑똑 grep하지만 강제로 수행할 수도 있습니다.

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

1짙은 붉은 색이 이렇게 생겼습니다 . 자세히 알아보기여기 색깔이 이상해.

관련 정보