[
명령은 일반 명령입니다. 대부분의 쉘은 효율성을 위해 내장 기능을 제공하지만 쉘의 일반적인 구문 규칙을 따릅니다. [
는 마지막 인수로 필요하지만 그렇지 않은 test
것을 제외하고 는 정확히와 동일합니다 .[
]
test
이중 괄호 [[ … ]]
는 특수 구문입니다. 그것들은 ksh (몇 년 후 [
)에 도입되어 [
올바르게 사용하기가 번거롭고 [[
쉘 특수 문자를 사용하는 새로운 멋진 추가 기능을 제공합니다. 예를 들어
[[ $x = foo && $y = bar ]]
전체 조건식 쉘 해석되기 때문에, 반면에 [ $x = foo && $y = bar ]
처음 두 개의 명령어로 분할 될 [ $x = foo
과 $y = bar ]
의해 분리 &&
연산자. 마찬가지로 이중 괄호를 사용하면 패턴 일치 구문과 같은 항목을 사용할 수 있습니다 (예 : 시작 [[ $x == a* ]]
값이 ; 단일 괄호 안에는 현재 디렉토리에서 이름이 시작되는 파일 목록으로 확장 됩니다 . 이중 괄호는 ksh로 처음 소개되었으며 ksh, bash 및 zsh에서만 사용할 수 있습니다.x
a
a*
a
작은 괄호 안에는 대부분의 다른 곳에서와 같이 변수 대체에 큰 따옴표를 사용해야합니다. 왜냐하면 명령에 대한 인수 일뿐 [
입니다. 이중 괄호 안에는 셸이 단어 분할이나 글 로빙을 수행하지 않기 때문에 큰 따옴표가 필요하지 않습니다. 명령이 아니라 조건식을 구문 분석합니다.
그러나 [[ $var1 = "$var2" ]]
바이트 대 바이트 문자열 비교를 수행하려는 경우 따옴표가 필요한 경우 는 예외입니다 . 그렇지 않으면 $var2
일치하는 패턴이됩니다 $var1
.
당신이 할 수없는 한 가지는 [[ … ]]
변수를 연산자로 사용하는 것입니다. 예를 들어, 이것은 완벽하게 합법적이지만 거의 유용하지 않습니다.
if [ -n "$reverse_sort" ]; then op=-gt; else op=-lt; fi
…
if [ "$x" "$op" "$y" ]; then …
당신의 예에서
dir="/home/mazimi/VirtualBox VMs"
if [ -d ${dir} ]; then …
내부 명령 if
입니다 [
4 개 인수 -d
, /home/mazimi/VirtualBox
, VMs
와 ]
. 셸은 구문 분석 -d /home/mazimi/VirtualBox
한 다음에 수행 할 작업을 모릅니다 VMs
. ${dir}
올바른 형식의 명령을 얻으려면 단어가 분리되는 것을 방지해야합니다 .
일반적으로 결과에 대해 단어 분할 및 globbing을 수행하려는 경우가 아니면 변수 및 명령 대체에 큰 따옴표를 사용하십시오. 큰 따옴표를 사용하지 않는 것이 안전한 주요 장소는 다음과 같습니다.
- 대입에서 :
foo=$bar
(그러나 export "foo=$bar"
같은 또는 대입 배열 에서 큰 따옴표가 필요합니다 array=("$a" "$b")
);
- A의
case
문 : case $foo in …
;
=
또는 ==
연산자 의 오른쪽을 제외한 이중 괄호 안에 (패턴 일치를 원하지 않는 경우) : [[ $x = "$y" ]]
.
이 모든 것에서 큰 따옴표를 사용하는 것이 맞으므로 고급 규칙을 건너 뛰고 항상 따옴표를 사용할 수 있습니다.