bash에서 if와 [[의 차이점은 무엇입니까?

bash에서 if와 [[의 차이점은 무엇입니까?

내가 볼

if cmd
then
echo Hi
fi

와는 다르게 작동합니다

if [[ $(cmd) ]]
then
echo Hi
fi

그렇다면 [[가 있고 없으면 어떻게 될까요?

답변1

셸에는 [테스트 명령의 별칭이 있습니다. 그것~이다명령. 이는 [[약간만 다른 일부 쉘의 특징입니다. Bash에서는 명령이 아닌 키워드이지만 명령처럼 작동합니다.

다음과 같이 생각할 수 있습니다. [["$(cmd)"의 출력을 해당 명령에 대한 인수로 실행하고 제공하고 있습니다. if그런 다음 의 반환 상태를 확인합니다 [[. 에 연산자가 지정되지 않으면 가 [[암시 -n됩니다.

   -n string
          True if the length of string is non-zero.

귀하의 예를 들어:

if cmd          # check the return status of cmd
if [[ $(cmd) ]] # check if cmd has any output

답변2

대괄호 없는 명령문 은 bash 명령으로 평가된 후 if expr반환 상태를 확인합니다 . expr성공하면 값으로 처리됩니다 true.

반면에 if [[ expr ]]이중 대괄호는 bash- 특정입니다.예어-f /path/to/file파일 존재 테스트와 같은 자체 옵션 세트를 처리 하거나 $a == $b. 이러한 대괄호 내에서 일부 표현식을 if [[ $(cmds) ]]. 그렇지 않으면 거기에 있는 모든 항목을 특수 표현식으로 처리하고 다르게 구문 분석됩니다.

if [ expr ]일반적으로 별칭(또는 어떤 경우에는 대략적인 구현)인 구문 도 있습니다 if test expr. 명령 test에 사용할 수 있는 옵션이 있으면 단일 대괄호 사이에서도 사용할 수 있습니다.

더 재미있게 말하자면, 숫자를 다룰 때 가장 좋은 구문이 있습니다 if ((expr)). 내부의 모든 것이 산술 표현식으로 평가되기 때문입니다. 이는 이중 괄호와 마찬가지로 키워드이기도 합니다.

기본적으로 if exprand if [ expr ]는 이식 가능하며(즉, 모든 쉘이 이를 처리할 수 있고 거의 동일하게 처리할 수 있음) and if [[ expr ]]구현 if (( expr ))에 따라 다릅니다. 즉, 평가가 사용 중인 쉘에 따라 크게 달라지는 키워드입니다(그리고 사용하는 경우). bash, zsh또는 같은 것을 사용하지 않으면 ksh존재하지 않을 수도 있습니다).

관련 정보