bash 스크립트에서 if 조건을 무효화하십시오.


162

나는 bash를 처음 사용하고 다음 명령을 부정하려고 노력하고 있습니다.

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
        echo "Sorry you are Offline"
        exit 1

인터넷에 연결되어 있으면 조건이 true를 반환합니다. 나는 그것이 다른 방향으로 일어나기를 원하지만 !어디에 두는 것이 효과가없는 것 같습니다.


3
어디에 두었습니까? if ! [[ ...작동
다른 사람

1
다음과 같이 사용할 수도 있습니다 : wget your_xxxx_params || (echo "oh oh"&& exit 1)
AKS

2
> 오류를 출력하기 위해 서브 쉘을 호출하기
tijagi

답변:


227

당신은 선택할 수 있습니다 :

if [[ $? -ne 0 ]]; then       # -ne: not equal

if ! [[ $? -eq 0 ]]; then     # -eq: equal

if [[ ! $? -eq 0 ]]; then

! 다음 식의 반환 값을 각각 반전시킵니다.


9
이중 괄호가 필요합니까? 왜 그런 겁니까?
Alexander Mills

1
@AlexanderMills : 여러 가지 방법이 있습니다. 이중 또는 단일 괄호 또는 test명령 사용 :if test $? -ne 0; then
Cyrus

4
이 답변은 불필요한 장황한 것입니다. if0 또는 1 인 명령문을 예상하므로 명령 자체를 사용하여 반전시킬 수 있습니다.if ! wget ...; then ...; fi
Nils Magnus


8

게으른 느낌이 들면 수술 후 ||(또는) 및 &&(그리고)를 사용하여 조건을 처리하는 간결한 방법 이 있습니다.

wget -q --tries=10 --timeout=20 --spider http://google.com || \
{ echo "Sorry you are Offline" && exit 1; }

8
실제 스크립트에서는 &&after echo 명령을로 변경해야 합니다 ;. 그 이유는 출력이 전체 디스크의 파일로 경로 재 지정되는 경우 echo실패를 리턴하고 exit절대 실행되지 않기 때문입니다. 이것은 아마도 당신이 원하는 행동이 아닙니다.
Score_Under

또는 당신은 사용 set -e하고 실패 echo하면 어쨌든 스크립트를 종료합니다
Jakub Bochenski

4

숫자를 비교하기 때문에 산술 표현식 을 사용하면 매개 변수를 쉽게 처리하고 비교할 수 있습니다.

wget -q --tries=10 --timeout=20 --spider http://google.com
if (( $? != 0 )); then
    echo "Sorry you are Offline"
    exit 1
fi

공지 방법 대신에 -ne, 당신은 사용할 수 있습니다 !=. 산술 문맥에서 $매개 변수 앞에 붙일 필요조차 없습니다 .

var_a=1
var_b=2
(( var_a < var_b )) && echo "a is smaller"

완벽하게 작동합니다. 그러나 이것은 $?특별한 매개 변수 에는 적용되지 않습니다 .

또한 (( ... ))0이 아닌 값을 true로 평가합니다. 즉, 0이 아닌 값의 경우 반환 상태가 0이고, 그렇지 않으면 1의 반환 상태가 있으므로

if (( $? )); then

그러나 이것은 저장된 키 입력보다 더 많은 사람들을 혼란스럽게 할 수 있습니다.

(( ... ))구문은 Bash에서 사용할 수 있지만 POSIX 셸 사양 에는 필요하지 않습니다 (가능한 확장이라고도 함).

이것은 모두 Cole의 답변Steven의 답변$?같이 내 의견 으로는 피하는 것이 좋습니다 .



@ DavidC.Rankin 오, 나는 그것을 찾지 못했습니다! 따라서 확장으로 언급되었지만 필수는 아닙니다. 수정하겠습니다.
Benjamin W.

1
네, 저도 항상 저를 얻었습니다. 그것은 쉘에서 인생을 더 쉽게 만듭니다:)
David C. Rankin

4

다음 -ne대신에 다른 비교 를 사용할 수 있습니다 -eq.

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -ne 0 ]]; then
    echo "Sorry you are Offline"
    exit 1
fi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.