명령이 성공 또는 실패한 경우 조건부로 작업을 수행하는 방법 “`command` returns any error”; then

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

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


답변

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

bash의 if진술은 정확히 다음과 같습니다.

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

주석에서 정보 추가 : 이 경우 에는 … 구문 을 사용할 필요 가 없습니다 . 자체는 명령과 거의 동일합니다 . 에서 사용하는 가장 일반적인 명령 일 수 있으며 , 이는 쉘 구문의 일부라는 가정으로 이어질 수 있습니다. 그러나 명령의 성공 여부를 테스트하려면 위에 표시된대로 명령 자체를 직접 사용하십시오 .[][testifif

편집 : 명확성을 위해 상단에 질문을 인용했습니다 (이 답변은 페이지 상단 근처에 나타나지 않습니다).


답변

쉘 명령이 작동하면 작은 일이 발생하면 &&구문을 사용할 수 있습니다 .

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"

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


답변

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

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

답변

이것은 나를 위해 일했다 :

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

경우는 command다음 성공적으로 echo "OK"실행되고, 그 성공 이후, 실행이 중지됩니다. 그렇지 않으면 &&건너 뛰어 echo "NOK"실행됩니다.


답변

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

예를 들어, Linux file에서 존재하지 않는 파일을 인수로 받고 find지정된 파일 사용자를 찾을 수없는 경우 GNU는 여전히 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

답변

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

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

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

답 : 예

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

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

  • 따옴표를 사용하십시오. A는 피 "blank"nothing.
  • 변수에 대한 새로운 현대 표기법은 ${variable}입니다.
  • 숫자 앞에 0을 추가하면 “아무 숫자도”피합니다.
  • 그러나 0을 추가하면 숫자가 base-8됩니다. 다음과 같은 오류가 발생합니다.
    • value too great for base (error token is "08")위의 숫자 7. 그때가 시작됩니다 10#.
    • 10#숫자를 강제로합니다 base-10.

답변

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

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