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 말 그대로 이러한 인수가 아닙니다. 셸은 다음 인수의 변수 치환을 수행합니다.$STATUS
syslog.
첫째, 변수 이름을 대문자로 쓸 필요가 없습니다.은 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; fi
foo || bar
foo
그 후 해당 명령어가 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
'programing' 카테고리의 다른 글
Excel의 .xlsx XML 형식에 대한 명확한 설명을 찾고 있습니다. (0) | 2023.04.19 |
---|---|
Excel VBA에서 Absolute 경로가 아닌 상대 경로 (0) | 2023.04.19 |
WPF 싱글인스턴스의 베스트프랙티스 (0) | 2023.04.19 |
C#에서 SQL Server에 대해 단순한 SQL 쿼리를 이스케이프하는 방법 (0) | 2023.04.19 |
Ansible을 사용하여 새 사용자 및 암호 만들기 (0) | 2023.04.19 |