Bash 스크립트의 경우 if 문과 함께 테스트 표현식을 언제 사용해야 하는지 혼란스럽습니다.
예를 들어 다음과 같이 작동합니다.
if finger | grep -q alex
그러나 아래의 경우는 그렇지 않습니다.
if [ finger | grep -q alex ]
그러나 다음을 수행할 수 있습니다.
if [ 3 -gt 5 ]
그렇다면 언제 테스트 표현식을 사용하고 언제 사용하지 말아야 할까요? 또한, 위 명령에 테스트 표현식을 사용할 수 있는 방법이 있나요?
답변1
test
혼란의 원인은 (AKA [
)가 성공(0) 또는 실패(0이 아닌) 결과를 반환하는 또 다른 명령이라는 사실을 모르거나 그 사실이 무엇인지 완전히 이해하지 못하기 때문인 것 같습니다. 수단.
if
항상 다음과 같이 실행합니다.
if command; then
do something
fi
elif
선택사항 또는 절 포함 else
.
명령은 test
또는 [
또는 finger
또는 grep
다른 것(길고 복잡한 명령 파이프라인이라도)이 될 수 있으며 모든 프로그램은 종료될 때 종료 코드를 반환합니다. @Kamil Maciorowski가 의견에서 말했듯이 중요한 것은 if
종료 코드이며 종료 코드의 출처는 중요하지 않습니다.
test
/는 [
많은 최신 셸(bash 포함)에 내장된 명령이지만 이것이 실제로 변경되는 것은 아니며 매우 일반적으로 사용되는 명령의 성능을 향상시키기 위해 설계된 최적화일 뿐입니다. 내장 명령이 되기 전에는 /usr/bin/test
실제로 /usr/bin/[
의 외부 버전이 오늘날 test
에도 여전히 [
존재합니다(GNU bash에서 내장 명령으로도 제공되지만 GNU coreutils에 포함되어 있습니다).
$ ls -l /usr/bin/test /usr/bin/[
-rwxr-xr-x 1 root root 68496 Sep 21 01:27 /usr/bin/[
-rwxr-xr-x 1 root root 60304 Sep 21 01:27 /usr/bin/test
$ dlocate /usr/bin/test '/usr/bin/\['
coreutils: /usr/bin/[
coreutils: /usr/bin/test
BTW, help [
bash에서 :
[: [ arg... ]
Evaluate conditional expression.
This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.