it-swarm-ko.tech

명령이 성공 또는 실패한 경우 조건부로 작업을 수행하는 방법

Bash에서 어떻게 이런 일을 할 수 있습니까?

if "`command` returns any error";
then
    echo "Returned an error"
else
    echo "Proceed..."
fi
337
Shinmaru

명령이 성공하거나 실패한 경우 조건부로 작업을 수행하는 방법

Bash의 if 문은 정확히 다음과 같습니다.

if command ; then
    echo "Command succeeded"
else
    echo "Command failed"
fi

주석에서 정보 추가 :이 경우 안함 [ ... ] 구문을 사용해야합니다. . [ 자체는 test와 거의 같은 명령입니다. 아마도 if에서 사용하는 가장 일반적인 명령 일 것입니다. 이는 셸 구문의 일부라는 가정으로 이어질 수 있습니다. 그러나 명령의 성공 여부를 테스트하려면 위에 표시된대로 if와 함께 명령 자체를 직접 사용하십시오.

413
Keith Thompson

쉘 명령이 작동하면 작은 일이 발생하면 && 구성 :

rm -rf somedir && trace_output "Removed the directory"

셸 명령이 실패했을 때 발생하는 작은 일과 마찬가지로 || :

rm -rf somedir || exit_on_error "Failed to remove the directory"

아니면 둘다

rm -rf somedir && trace_output "Removed the directory" || exit_on_error "Failed to remove the directory"

아마도 이러한 구성으로 많은 것을 수행하는 것은 현명하지 않지만 때로는 제어 흐름을 훨씬 명확하게 만들 수 있습니다.

152
Bruce Ediger

가장 최근의 명령/기능을 실행 한 결과를 포함하는 $? 값을 확인하십시오.

#!/bin/bash

echo "this will work"
RESULT=$?
if [ $RESULT -eq 0 ]; then
  echo success
else
  echo failed
fi

if [ $RESULT == 0 ]; then
  echo success 2
else
  echo failed 2
fi
118
Ryan Stewart

이것은 나를 위해 일했다 :

command && echo "OK" || echo "NOK"

command가 성공하면 echo "OK"이 (가) 실행되고 성공하면 실행이 중지됩니다. 그렇지 않으면 &&을 건너 뛰고 echo "NOK"가 실행됩니다.

52
German Rumm

if...then...fi&&/|| 접근 방식의 유형은 테스트하려는 명령에 의해 종료 된 종료 상태를 처리합니다 (성공시 0). 그러나 일부 명령은 명령이 실패했거나 입력을 처리 할 수없는 경우 0이 아닌 종료 상태를 리턴하지 않습니다. 이는 일반적인 if&&/|| 접근법은 이러한 특정 명령에 대해 작동하지 않습니다.

예를 들어, Linux에서 GNU file는 존재하지 않는 파일을 인수로 받고 find이 (가) 지정된 파일 사용자를 찾을 수없는 경우 여전히 0으로 종료됩니다. .

$ find . -name "not_existing_file"                                          
$ echo $?
0
$ file ./not_existing_file                                                  
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0

이러한 경우 상황을 처리 할 수있는 잠재적 인 방법 중 하나는 stderr/stdin 메시지를 읽는 것입니다. file 명령으로 반환 된 명령 또는 find와 같이 명령의 출력을 구문 분석합니다. 이를 위해 case 문을 사용할 수 있습니다.

$ file ./doesntexist  | while IFS= read -r output; do                                                                                                                  
> case "$output" in 
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed

$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi                                                                                     
File not found
6
Sergiy Kolodyazhnyy

내가 일으킬 수있는 가장 오류가 발생하기 쉬운 것은 다음과 같습니다.

  • 먼저 가치를 얻으십시오. 다음과 같은 작업을 수행한다고 가정하십시오.

RR=$?

이제이 상황뿐만 아니라 다른 사람들이 직면 할 수도있는 사항을 고려하십시오.

정의 된 변수 :

$ AA=1 ; if (( "10#0${AA}" == 1 )) ; then echo yes ; else echo no ; fi

답 : 예

$ AA=1 ; if (( "10#0${AA}" != 1 )) ; then echo yes ; else echo no ; fi

답변 : 아니오

정의되지 않은 변수:

$ AA=1 ; if (( "10#0${BB}" == 1 )) ; then echo yes ; else echo no ; fi

답변 : 아니오

$ AA=1 ; if (( "10#0${BB}" != 1 )) ; then echo yes ; else echo no ; fi

답 : 예

$ AA=1 ; if (( "10#0${BB}" == 0 )) ; then echo yes ; else echo no ; fi

답 : 예

이것은 모든 종류의 오류를 방지합니다.

모든 구문을 알고 있을지 모르지만 여기에 몇 가지 팁이 있습니다.

  • 따옴표를 사용하십시오. "blank"nothing 인 것을 피하십시오.
  • 변수에 대한 새로운 최신 표기법은 ${variable}입니다.
  • 숫자 앞에 0을 추가하면 "아무 숫자도"피합니다.
  • 그러나 0을 추가하면 숫자가 base-8가됩니다. 와 같은 오류가 발생합니다.
    • 7보다 큰 숫자의 경우 value too great for base (error token is "08"). 10#가 등장 할 때입니다.
    • 10#는 숫자를 base-10로 만듭니다.
4
Dr Beco

당신은 이것을 할 수 있습니다 :

if ($( ping 4.4.4.4 -c1 > /dev/null )) ; then
  echo "ping response succsess!!!"
fi
1
Daniel
#!/bin/bash

if command-1 ; then
   echo "command-1 succeeded and now running from this block command-2"
   command-2
else
   echo "command-1 failed and now running from this block command-3"
   command-3
fi
1
Nick Vladiceanu

이 글의 다른 부분에서 언급했듯이, 원래의 질문은 기본적으로 스스로 대답합니다. 다음은 if 조건도 중첩 될 수 있음을 보여주는 그림입니다.

이 예제는 if를 사용하여 파일이 있는지와 일반 파일인지 확인합니다. 이러한 조건이 충족되면 크기가 0보다 큰지 여부를 확인하십시오.

#!/bin/bash

echo "Which error log are you checking today? "
read answer

if [ -f /opt/logs/$answer*.errors ]
    then
        if [ -s /opt/logs/$answer*.errors ]
            then
                echo "Content is present in the $answer error log file."
            else
                echo "No errors are present in the $answer error log file."
        fi
    else
        echo "$answer does not have an error log at this time."
fi
1
quartzinquartz