
나는 할 수 있다고 본다
$ [ -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
== 조건(테스트 명령일 수도 있음)이면 명령을 실행합니다.
따라서 이동성 [
과 [[
사용을 위해서만 사용 [
됩니다.
if
POSIX와 호환됩니다. 따라서 작업과 예상되는 행동 중 하나를 [
선택 해야 하는 경우 .if
답변4
이식성을 위해서는 test
/ 를 사용하세요 [
. 하지만 이식성이 필요하지 않다면 자신과 스크립트를 읽는 다른 사람의 건강을 위해 [[
. :)
또한What is the difference between test, [ and [[ ?
배쉬FAQ.