programing

Bash에서 "if" 문의 "and" 연산자

powerit 2023. 4. 19. 00:31
반응형

Bash에서 "if" 문의 "and" 연산자

웹 사이트가 다운되었는지, 어떤 이유로 "and" 연산자가 작동하지 않는지 확인하기 위해 간단한 Bash 스크립트를 작성하려고 합니다.

#!/usr/bin/env bash

WEBSITE=domain.example
SUBJECT="$WEBSITE DOWN!"
EMAILID="an@email.example"
STATUS=$(curl -sI $WEBSITE | awk '/HTTP\/1.1/ { print $2 }')
STRING=$(curl -s $WEBSITE | grep -o "string_to_search")
VALUE="string_to_search"

if [ $STATUS -ne 200 ] && [[ "$STRING" != "$VALUE" ]]; then
    echo "Website: $WEBSITE is down, status code: '$STATUS' - $(date)" | mail -s "$SUBJECT" $EMAILID
fi

"-a" 연산자도 작동하지 않습니다.

if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]

또한 언제 사용해야 하는지 알려주실 수 있나요?

  • 싱글 대괄호 및 더블 대괄호
  • 괄호

?

있는 것은, 가지고 있는 것이 안 된다.${STATUS}어어있있있있다다다음과 같은 작업을 수행하는 것이 좋습니다.

if ! [ "${STATUS}" -eq 200 ] 2> /dev/null && [ "${STRING}" != "${VALUE}" ]; then

또는

if [ "${STATUS}" != 200 ] && [ "${STRING}" != "${VALUE}" ]; then

대본에 어떤 문제가 있는지 정확하게 보여주지 않으셨기 때문에 말하기 어렵습니다.

의견: 절대 하지 마세요: 절대 사용하지 마세요.[[중요한 에러 메시지를 억제해, 다른 셸에 이식할 수 없습니다.

이것을 시험해 보세요.

if [ "${STATUS}" -ne 100 -a "${STRING}" = "${VALUE}" ]

또는

if [ "${STATUS}" -ne 100 ] && [ "${STRING}" = "${VALUE}" ]

이것을 시험해 보세요.

if [ $STATUS -ne 200 -a "$STRING" != "$VALUE" ]; then

견적:

"-a" 연산자도 작동하지 않습니다.

[ $STATUS - ne 200 ]-a [[ "$STRING" != "$VALUE" ]의 경우

자세한 설명은 다음과 같습니다.[ ★★★★★★★★★★★★★★★★★」]부쉬하다if키워드에서는 프로세스에 의해 평가되는 조건이 도입됩니다.이 조건은 프로세스의 종료 상태가 true일 때 true입니다.0거짓

상태 평가 프로세스로 사용하기 위해 프로그램이 있습니다.man test파일 존재 테스트, 문자열 테스트 및 이러한 조합과 같은 간단한 조건을 평가할 수 있는 프로그램입니다. -a ★★★★★★★★★★★★★★★★★」-o논리 연산자 인수.

은 이런 도 합니다.if test -f filename; then foo bar; fi귀찮은 귀찮은 프로그램, [은 사실 '아주 좋다'와되어 있습니다.test★★★★★★★★★★★★★★★★★★★★★test라고 [ 은 , 을 찾을 수 것으로 예상합니다.]이은 " " "로 구성됩니다.test 및 프로그램bash전혀 눈치채지 못하고 있습니다.

★★★★★★★★★★★★★★★★★.if test -f filename으로 (생성되는 if [ -f filename ]두 " " " 입니다.test프로그램이 시작되고 두 프로세스가 동일하게 동작해야 합니다.

당신의 실수는 다음과 같습니다.if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]if+ + + + + + + + + + + + + 즉, + + + + + +[은 인수와 함께 됩니다.$STATUS,-ne,200,],-a,[[,"$STRING",!=,"$VALUE",]] 여기서2 주의할 점은]에서 「」에 .[ , , , , , , , , , , , , , , , , , .]이치노이것이 프로그램이 불만을 제기하는 이유입니다.

,과는 로, 의의해 also also는 것에 주의해 주세요.[ 「 」를 참조해 주세요.[[예'는 "예'입니다.bash POSIX , POSIX 미표준sh단, 명령어의 첫 번째 단어일 경우에만 특별한 단어로 인식됩니다.예에서는, 「」를 해 주세요.[[ 그대로 '는 일반 인수)로 됩니다."[["되어 「인수 리스트」의 에 사용됩니다.[프로그램.


1 실제로는 단일 프로세스일 필요는 없지만 작업일 수 있습니다.즉, 다음과 같이 연결된 프로세스의 조합입니다.|,&&,||외장.

2 말 그대로 이러한 인수가 아닙니다. 셸은 다음 인수의 변수 치환을 수행합니다.$STATUSsyslog.

첫째, 변수 이름을 대문자로 쓸 필요가 없습니다.은 all-caps 변수 해야 합니다.export다른 실행 파일의 이익을 위해 환경에 도입할 수 있습니다.

둘째, 현재 가지고 있는 것은&&는 동작하지만 빈 상태 변수 또는 비상태 변수에서는 복원력이 높지 않습니다.

★★★★★★★★★★★★★★★★★★★.-a이 잘 안 되다-a입니다.test[]; 괄호 안에 들어갑니다.

기본적으로 셸 내의 조건조건에 대해 알아야 할 가장 중요한 것은 명령어일 입니다.이 if 식:

if foo; then
  echo true
else
  echo false
fi

이것과 똑같이 동작합니다.

foo
if [ $? -eq 0 ]; then
  echo true
else
  echo false
fi

그 뒤에 if (오류)while ★★★★★★★★★★★★★★★★★」until는, 를 사용할 수 는 임의의 명령어를 사용할 수 있습니다.

은 ★★★★★★★★★★★★★★★★★★★★★★.&& ★★★★★★★★★★★★★★★★★」||이치노을 사용법 ' ' 'foo && bar합니다.foo 상태이 됩니다.bar 사실상 (으), (으), (으), (으), (으), (으), (으)의 if foo; then bar; fifoo || barfoo그 후 해당 명령어가 0이 아닌 상태로 종료되면bar 사실상 (으), (으), (으), (으), (으), (으), (으)의 if ! foo; then bar; fi

그것은 많은 초보 셸 프로그래머들이 놓치는 주요 사항이다.셸에는 식 자체가 없습니다.실행 명령어만 있습니다.

그러나 일반 비셸 프로그래밍 언어에서 부울식일 수 있는 비교 및 기타 작업을 수행하는 경우가 많기 때문에 이러한 작업을 수행하기 위해 실행할 수 있는 특별한 명령이 있습니다.예전에는 별개의 바이너리였지만 요즘은 셸에 내장되어 있습니다.은 ★★★★★★★★★★★★★★★.test 할 수 있지만, 도 할 수 .[하지 않으면 ] 안 .test'테스트' '참' 상태 0 '거짓' non 0 'bon 0' 보통 걸 되는 죠.if명령어는 다른 프로그래밍 언어에서 실행할 수 있는 명령어로 변환되어 셸용으로 효과적으로 변환됩니다.

★★★의 []소지가 하면 마치 인 것 같다.test일반 셸 명령어와 동일한 명령줄 처리를 사용합니다.요, 보면요.< ★★★★★★★★★★★★★★★★★」>사용해보십시오.( ★★★★★★★★★★★★★★★★★」)그룹화하면 하위 셸을 생성할 수 있습니다(명령어 인수 중간에 생성하면 구문 오류가 발생할 수 있습니다. .&& ★★★★★★★★★★★★★★★★★」||명령어를 조기에 종료하고 구문 오류를 트리거합니다.

쓸 수 요.&& ★★★★★★★★★★★★★★★★★」|| 시점에서는 하나의 인스턴스가 아닌 여러 개의 테스트명령어 인스턴스를 실행합니다.단,-a ★★★★★★★★★★★★★★★★★」-o브래킷 안에만 있으면 됩니다.따라서 이들 2개의 파이프라인이 동일한 결과를 얻을 수 있습니다.

[ "$status" -ne 200 -a "$string" != "$value" ]

[ "$status" -ne 200 ] && [ "$string" != "value" ]

점은 첫 1개의 입니다.test명령어, 두 번째 명령어는 그 중 두 가지를 실행합니다.

Korn 쉘에서는 새로운 버전의 테스트명령어가 도입되었습니다.이러한 테스트명령어 사이에는 일반 명령어와 동일하게 해석되지 않는 특수한 구문 환경이 있습니다. 않은 파라미터 확장로 묶지 않은 괄호, 따옴표로 묶지 않은 파라미터 을 안전하게 사용할 수 .< ★★★★★★★★★★★★★★★★★」>('String Comparison'('String '('String Comparison't)-lt ★★★★★★★★★★★★★★★★★」-gt&& ★★★★★★★★★★★★★★★★★」||부울 연산자로 지정합니다. [[]], 글로벌 패턴Glob pattern, 「Glob patterns」, 「 patterns」, 「Glob patterns」)합니다.[[ foo == f*]] 정규 「 」 )[[ foo =~ ^f ]]를 참조해 주세요.

Bash 및 Zsh와 같은 최신 쉘은 Ksh에서 이 구성을 상속받았지만 POSIX 사양의 일부가 아닙니다.POSIX를 엄격하게 준수할 필요가 있는 환경에서는, 이 환경으로부터 멀리해 주세요.그렇지 않으면 기본적으로는 개인 취향에 따라 달라집니다.

「」에 해 주세요.$(()) POSIX의 일부이며 POSIX와 매우 유사한 규칙을 가지고 있습니다.[[]]은 동등성 및 검정 true의 1)이 문자열이 아닌 로 수행된다는 주요 차이점은 동등성 및 불평등성 검정(여기서는 숫자 값, false는 0, true는 1)이 문자열이 아닌 숫자로 수행된다는 것입니다. [[ 10 < 2 ]] '''는)$(( 10 < 2 ))00을 합니다.

의 셸은 POSIX를 하였습니다.$- of - " " " 。(()) 따옴표로 합니다.let 명령어, 명령어, 를 사용할 수.if숫자를 다룰 때는 표현식을 사용합니다. 첫 도 '어느 조건'이라고 쓸 수 요.(( status != 200 ))POSIX를 고집하는 것 외에, 그것은 개인의 취향에 달려 있습니다.사용하는 것을 좋아합니다.(())가 숫자를항상 은 그냥 합니다.[ ★★★★★★★★★★★★★★★★★」[[ 이 연산자를 합니다.-lt.

중요한 건, 코드를 다시 쓰는 방법이에요

website=domain.example
subject="$website DOWN!"
email=an@email.example
value="string_to_search"
status=$(curl -sI "$website" | awk '/HTTP\/1.1/ { print $2 }')
string=$(curl -s "$website" | grep -o "$value")

if (( status != 200 )) && [[ $string != $value ]]; then
    mail -s "$subject" "$email" <<<"Website: $website is down, status code: '$status' - $(date)"
fi

언급URL : https://stackoverflow.com/questions/13408493/an-and-operator-for-an-if-statement-in-bash

반응형