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

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

Bash에서 어떻게 이런 일을 할 수 있나요?

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

답변1

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

이것이 바로 bash if문이 하는 일입니다:

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

댓글에서 정보 추가: 귀하아니요이 경우 ... 구문을 사용해야 합니다 [. 는 그 자체로 와 거의 동일한 명령입니다. 아마도 에서 가장 일반적으로 사용되는 명령이므로 쉘 구문의 일부라고 가정할 수 있습니다. 그러나 명령이 성공했는지 테스트하려면 위와 같이 명령 자체를 와 함께 직접 사용하십시오.][testifif

답변2

쉘 명령이 작동할 때 발생하고 싶은 작은 일의 경우 다음 &&구성을 사용할 수 있습니다.

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"

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

답변3

$?가장 최근 명령/함수 실행 결과를 포함하는 selected 값 :

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

답변4

if...then...fi&&/ 메소드 유형 은 ||테스트하려는 명령이 반환한 종료 상태(성공 시 0)를 처리하지만 일부 명령은 명령이 실패하거나 입력을 처리할 수 없는 경우 0이 아닌 종료 상태를 반환하지 않습니다. 이는 일반적인 if&&/ ||메소드가 이러한 특정 명령에서 작동하지 않음을 의미합니다.

예를 들어, Linux에서 fileGNU는 존재하지 않는 파일을 인수로 받고 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읽 거나 명령의 출력을 구문 분석하는 것 입니다 . 이 목적을 위해 명령문을 사용할 수 있습니다.stdinfilefindcase

$ 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

관련 정보