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

bash에서 이와 같은 작업을 수행하려면 어떻게해야합니까?

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

답변

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

그게 바로 bash입니다. “s if 문은 다음을 수행합니다.

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

댓글에서 정보 추가 : 당신은 하지 않습니다 이 경우 [] 구문을 사용해야합니다. [ 그 자체가 test와 거의 동일한 명령입니다. 아마도 if에서 사용하는 가장 일반적인 명령 일 것입니다. “쉘”구문의 일부라고 가정합니다. 그러나 명령의 성공 여부를 테스트하려면 위에 표시된대로 if와 함께 명령 자체를 직접 사용하십시오.

설명

  • 세미콜론이 중요합니다.
  • 또는 then를 별도의 줄에 입력 할 수도 있습니다.
  • @Joe : if ! command ; then ... ; fi를 의미하시는 것 같습니다. [는 그 자체가 명령이며 '이 경우에는 필요하지 않습니다.
  • @Joe : My way 또한 올바른 미덕이 있습니다. if [ ! command ]는 ' command를 실행하지 않습니다. command를 문자열로 취급하고 길이가 0이 아니기 때문에 참으로 취급합니다. [ test 명령의 동의어입니다.
  • 죄송합니다. ' 맞습니다.

답변

작은 일 쉘 명령이 작동하는 경우 발생하려는 경우 && 구성을 사용할 수 있습니다.

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" 

이러한 구조로 많은 작업을 수행하는 것은 현명하지 못하지만 때때로 제어 흐름을 훨씬 더 명확하게 만들 수 있습니다.

댓글

  • 그들은 더 짧고 (적어도 일부 셸에서는) 더 빠릅니다. 한 번 시도해 본 조건부 구성으로 작성된 괴물 Ultrix 설치 스크립트를 기억하면 떨립니다. 해독 …

답변

$?, 가장 최근의 명령 / 함수를 실행 한 결과를 포함합니다 :

#!/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 

댓글

  • 기술적으로는 정확하지만 (따라서 반대 투표를 보장하지 않음) '는 Bash '의 if 관용구를 사용하지 않습니다. 저는 Keith Thompson '의 답변을 선호합니다.
  • 이 관용구에는 이점이 있습니다. 반환 값을 유지합니다. 전반적으로 나는 이것이 더 장황하지만 더 강력하다고 생각합니다. '도 읽기 쉽습니다.
  • " 배시 란 무엇입니까 ' s if idiom "?
  • @Nowaker if의 유일한 목적은 이. Bash의 흐름 제어 조건은 모두 뒤에서 $?를 검사합니다. '가 하는 일입니다. 대부분의 경우 그 값을 명시 적으로 조사하는 것은 불필요하며 일반적으로 초보자 반 패턴입니다.
  • 가독성을 위해 선호합니다. 주 명령은 일반적으로 매우 긴 명령입니다. " if " 문 안에 넣으면 가독성이 떨어집니다.

답변

저에게 효과적이었습니다.

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

if command가 성공하면 echo "OK"가 실행되고 성공 했으므로 실행이 중지됩니다. 그렇지 않으면 &&를 건너 뜁니다. echo "NOK"가 실행됩니다.

코멘트

  • 실패한 경우 작업을 수행하고 종료 코드 (명령 프롬프트에 표시하거나 스크립트에서 테스트)하려면 다음을 수행 할 수 있습니다. command && echo "OK" || c=$?; echo "NOK"; $(exit $c)
  • @ Sam-Hasler : shouldn ' command && echo "OK" || (c=$?; echo "NOK"; (exit $c))가 아닙니까?
  • 또한 echo "OK" 부분 자체가 실패하면 더 좋습니다. command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c))
  • @ jrw32982, Nice, 저는 ' 이전 구조를 사용했습니다. 하지만 후자는 아닙니다.
  • 진짜 답변은 댓글에 있습니다. 감사합니다.

답변

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

예를 들어, Linux GNU에서 file는 존재하지 않는 파일을 인수로 받고 사용자가 지정한 파일을 찾을 수 없습니다.

$ 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 

답변

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

  • 먼저 가치를 얻습니다. 다음과 같은 작업을한다고 가정 해보십시오.

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로 지정하지 마십시오.
  • 변수에 대한 새로운 최신 표기법은 .
  • 숫자 앞에 0을 연결하면 “숫자 없음”을 피할 수도 있습니다.
  • 하지만 0을 추가하면 숫자가 base-8.
    • value too great for base (error token is "08") 7 위의 숫자에 대해 다음과 같은 오류가 표시됩니다. 이때 10#가 작동합니다.
    • 10#는 숫자를 .

답변

다음과 같이 할 수 있습니다.

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

댓글

  • 작동하지만 복잡합니다. ' 하위 셸의 하위 셸에서 ping을 실행하면 ping의 출력이 명령으로 실행되는 관점에서 캡처됩니다. 그러나 출력이 항상 빈 문자열 인 / dev / null로 리디렉션되기 때문입니다. 따라서 ' 서브 셸에서 아무 것도 실행하지 않습니다. 즉, 이전 종료 상태 (명령 대체 서브 셸, 즉 ping)가 유지됩니다. 분명히 올바른 방법은 여기에서 if ping ...; then입니다.

답변

이 스레드의 다른 부분에서 언급했듯이 원래 질문은 기본적으로 자체적으로 대답합니다. 다음은 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 

댓글

  • 그렇게 답변을했지만 답변으로는 문제가 해결되지 않습니다.
  • @JeffSchaller, 메모 해 주셔서 감사합니다. 질문에 대한 참조를 포함하도록 게시물을 수정했습니다.

답변

#!/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 

댓글

답변

$?가 상태를 제공하므로이 방법으로 간단히 수행 할 수 있습니다. 실행 된 마지막 명령입니다.

따라서

#!/bin/sh ... some command ... if [ $? == 0 ] ; then echo "<the output message you want to display>" else echo "<failure message>" fi 

코멘트

  • 비 공감 : 이것은 단순히 일관 적이라는 이유로 합법적으로 비판을받은 이전 답변을 의역 한 것입니다.
  • 사실 이것이 제가 찾던 것입니다. ' " 명령 "이 " set -e " if의 일부인 경우 ' t '.반대 투표를하면 ' 안됩니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다