test 또는 [ 또는 [[ bash 쉘과 다른 쉘 사이에서 더 이식성이 있습니까?

test 또는 [ 또는 [[ bash 쉘과 다른 쉘 사이에서 더 이식성이 있습니까?

나도 할 수 있다는 걸 알아

$ [ -w /home/durrantm ] && echo "writable"
writable

또는

$ test -w /home/durrantm && echo "writable"
writable

또는

$ [[ -w /home/durrantm ]] && echo "writable"
writable

나는 세 번째 구문을 사용하고 싶습니다. 모든 측면에서 그리고 모든 부정적인 경우와 극단적인 경우에서 동일합니까? Ubuntu의 bash와 OS X 또는 이전/새 bash 버전(예: 4.0 이전/이후)과 같이 이식성에 차이가 있습니까? 모두 같은 방식으로 표현식을 확장합니까?

답변1

예, 차이점이 있습니다. 가장 이식성이 뛰어난 것은 test또는 입니다 [ ]. 이것들은 모두POSIX test사양.

구조 if ... fi는 또한POSIX에 의해 정의됨그리고 완전히 이식 가능해야 합니다.

[[ ]]기능은 ksh일부 버전 bash(모두 현대적이다), 다른 쉘 zsh, 어쩌면 다른 쉘에 있을 수도 있지만 다양한 다른 간단한 쉘에는 sh없습니다 .dash

따라서 스크립트를 이식 가능하게 만들려면 또는 를 사용 하세요 [ ].testif ... fi

답변2

[명령의 동의어이며 test또한배쉬 내장그리고 별도의 명령. 하지만 [[하나배쉬 키워드특정 버전에서만 사용할 수 있습니다. 따라서 이식성의 이유로 단일 []또는test

[ -w "/home/durrantm" ] && echo "writable"

답변3

이는 [] && cmd건물과 동일하지 않습니다.if .. fi

때로는 매우 유사하게 작동하므로 ...를 [] && cmd사용할 수 있지만 if .. fi가끔만 사용할 수 있습니다. 조건이 있는 경우 실행할 명령이 여러 개 있거나 if .. else .. fi해당 논리를 주의 깊게 이해해야 하는 경우.

몇 가지 예를 들면 다음과 같습니다.

[ -z "$VAR" ] && ls file || echo wiiii

아니 똑같다

if [ -z $VAR ] ; then
  ls file
else
  echo wiii
fi

ls실패 하면 echo실행되지만 if.

다른 예시:

[ -z "$VAR" ] && ls file && echo wiii

같지 않음

if [ -z "$VAR" ] ; then
   ls file
   echo $wiii
fi

이 구조의 기능은 동일하지만

[ -z "$VAR" ] && { ls file ; echo wiii ; }

;after echo는 중요하며 반드시 존재해야 한다는 점에 유의하세요 .

따라서 위의 진술을 계속하면 다음과 같이 말할 수 있습니다.

[] && cmd== 첫 번째 명령이 성공하면 다음 명령을 실행합니다.

if .. fi== 조건(테스트 명령일 수도 있음)인 경우 명령을 실행합니다.

[따라서 [[및 사용 간의 이식성을 위해서만 [.

ifPOSIX 규격. [따라서 둘 중 하나를 선택해야 한다면 if작업과 예상되는 동작을 고려하세요.

답변4

이식성을 위해서는 test/ 를 사용하세요 [. 그러나 이식성이 필요하지 않다면 자신의 정신과 스크립트를 읽는 다른 사람들의 정신을 위해 를 사용하십시오 [[.

또한 What is the difference between test, [ and [[ ?보십시오배쉬 FAQ.

관련 정보