나도 할 수 있다는 걸 알아
$ [ -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 ; }
;
after echo는 중요하며 반드시 존재해야 한다는 점에 유의하세요 .
따라서 위의 진술을 계속하면 다음과 같이 말할 수 있습니다.
[] && cmd
== 첫 번째 명령이 성공하면 다음 명령을 실행합니다.
if .. fi
== 조건(테스트 명령일 수도 있음)인 경우 명령을 실행합니다.
[
따라서 [[
및 사용 간의 이식성을 위해서만 [
.
if
POSIX 규격. [
따라서 둘 중 하나를 선택해야 한다면 if
작업과 예상되는 동작을 고려하세요.
답변4
이식성을 위해서는 test
/ 를 사용하세요 [
. 그러나 이식성이 필요하지 않다면 자신의 정신과 스크립트를 읽는 다른 사람들의 정신을 위해 를 사용하십시오 [[
.
또한 What is the difference between test, [ and [[ ?
보십시오배쉬 FAQ.