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 ]는 이식 가능하며(즉, 모든 쉘은 이를 처리하고 거의 동일하게 처리할 수 있음) 구현 if [[ expr ]]에 따라 if (( expr ))다릅니다. 즉, 키워드이며 평가는 쉘을 사용하는 위치에 따라 크게 달라집니다( 사용하는 경우에는 존재하지 않을 수도 있습니다 ). bash, zsh, 또는 )과 같은 것을 사용하지 마십시오.ksh

관련 정보