if 문과 함께 테스트 표현식을 언제 사용해야 합니까?

if 문과 함께 테스트 표현식을 언제 사용해야 합니까?

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 `['.

관련 정보