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
와 함께 명령 자체를 직접 사용하십시오.
설명
답변
작은 일 쉘 명령이 작동하는 경우 발생하려는 경우 &&
구성을 사용할 수 있습니다.
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 '.반대 투표를하면 ' 안됩니다.
then
를 별도의 줄에 입력 할 수도 있습니다.if ! command ; then ... ; fi
를 의미하시는 것 같습니다.[
는 그 자체가 명령이며 '이 경우에는 필요하지 않습니다.if [ ! command ]
는 'command
를 실행하지 않습니다.command
를 문자열로 취급하고 길이가 0이 아니기 때문에 참으로 취급합니다.[
는test
명령의 동의어입니다.