bash에서 어떻게 이런 일을 할 수 있습니까?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
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
주석에서 정보 추가 : 이 경우 에는 ... 구문 을 사용할 필요 가 없습니다 . 자체는 명령과 거의 동일합니다 . 에서 사용하는 가장 일반적인 명령 일 수 있으며 , 이는 쉘 구문의 일부라는 가정으로 이어질 수 있습니다. 그러나 명령의 성공 여부를 테스트하려면 위에 표시된대로 명령 자체를 직접 사용하십시오 .[
]
[
test
if
if
편집 : 명확성을 위해 상단에 질문을 인용했습니다 (이 답변은 페이지 상단 근처에 나타나지 않습니다).
then
별도의 줄에 넣을 수 있습니다 .
if ! command ; then ... ; fi
. [
그 자체가 명령이며,이 경우에는 필요하지 않습니다.
쉘 명령이 작동하면 작은 일이 발생하면 &&
구문을 사용할 수 있습니다 .
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
if
관용구를 사용하지 않습니다 . Keith Thompson의 답변을 선호합니다.
if
이 작업을 수행하는 것입니다. Bash의 흐름 제어 조건은 모두 $?
뒤에서 검사 합니다. 그것이 그들이하는 일입니다. 대부분의 경우 명시 적으로 그 가치를 검사하는 것은 불필요해야하며 일반적으로 초급 반 패턴입니다.
if ! cmd
괜찮습니다. 그렇지 않으면 일반적인 배열은 else
절 을 사용하는 것 입니다. 빈 칸을 가질 수는 없지만 then
때로는 no-op가 중요한 then : nothing; else
곳을 볼 수 있습니다 :
. true
거기에서도 작동합니다.
이것은 나를 위해 일했다 :
command && echo "OK" || echo "NOK"
경우는 command
다음 성공적으로 echo "OK"
실행되고, 그 성공 이후, 실행이 중지됩니다. 그렇지 않으면 &&
건너 뛰어 echo "NOK"
실행됩니다.
command && echo "OK" || c=$?; echo "NOK"; $(exit $c)
command && echo "OK" || (c=$?; echo "NOK"; (exit $c))
않습니까?
echo "OK"
부품 자체가 고장날 수있는 경우 더 좋습니다.command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c))
접근의 유형 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
답 : 예
이것은 모든 종류의 오류를 방지합니다.
모든 구문을 알고 있을지 모르지만 여기에 몇 가지 팁이 있습니다.
"blank"
로 nothing
.${variable}
입니다.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
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
#!/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