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
편집 : 명확성을 위해 상단에 질문을 인용했습니다 (이 답변은 페이지 상단 근처에 나타나지 않습니다).
답변
쉘 명령이 작동하면 작은 일이 발생하면 &&
구문을 사용할 수 있습니다 .
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