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

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

나는 할 수 있다고 본다

$ [ -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

따라서 스크립트를 이식 가능하게 만들려면 [ ]또는 test를 사용하세요 if ... 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 ; }

;에코가 중요하므로 꼭 있어야 합니다 .

위의 진술을 다시 시작하면 다음과 같이 말할 수 있습니다.

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

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

따라서 이동성 [[[사용을 위해서만 사용 [됩니다.

ifPOSIX와 호환됩니다. 따라서 작업과 예상되는 행동 중 하나를 [선택 해야 하는 경우 .if

답변4

이식성을 위해서는 test/ 를 사용하세요 [. 하지만 이식성이 필요하지 않다면 자신과 스크립트를 읽는 다른 사람의 건강을 위해 [[. :)

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

관련 정보