답변:
주요 질문에 대답하기 위해, ${foo}라고 "매개 변수 확장" . 정확히 말하면 $자체가 매개 변수 확장을 시작 { }하며 실제로 POSIX 사양 에 따라 선택 사항 이지만 변수 이름의 끝을 나타내는 데 유용 할 수 있습니다.
$ foo="bar"
$ echo $fooBaz ## fails, no variable named $fooBaz exists
$ echo ${foo}Baz ## works, $foo is expanded and the string Baz is appended
barBaz
기본적 $foo와 ${foo}동일하다. 위와 같은 경우 또는 문자열 조작을 수행하는 경우와 완전히 동일합니다.
그러나 실제로 두 가지 중 하나를 사용해서는 안됩니다. 엄지 손가락의 규칙은 매우 몇 가지 예외를 제외하고, 당신이해야한다는 것입니다 항상 사용 "$foo"또는 "${foo}"결코 $foo나 ${foo}. split + glob 연산자를 호출하지 않도록 항상 변수를 인용해야합니다 (나중에 자세히 설명). 당신은 확실히 원하지 않습니다 $foo$. 결승 $은 관련이 없습니다 :
$ foo="bar"
$ echo "$foo$"
bar$
따라서 인용되지 않은 변수는 때때로 괜찮습니다.
$ echo $foo
bar
그들은 일반적으로 피하고 실제로 피해야합니다 :
$ if [ -n $foo ]; then echo empty; else echo "not empty"; fi ## fails
empty
$ if [ -n "$foo" ]; then echo empty; else echo "not empty"; fi ## works
not empty
괄호는 여기에서도 도움이되지 않습니다.
$ if [ -n ${foo} ]; then echo empty; else echo "not empty"; fi ## fails
empty
$ if [ -n "${foo}" ]; then echo empty; else echo "not empty"; fi ## works
not empty
당신이 사용하는 경우 $foo또는 ${foo}, 쉘은 것이다 분리 합니다 (설정이 변경 될 수 있습니다 공백에 변수에 저장된 값을 IFS리스트로 뭔가 다른 변수를) 다음 목록의 각 요소는로 처리됩니다 글로브의 에 패턴 및 확장 일치하는 파일 또는 디렉토리 이것을 split + glob 연산자라고합니다. 설명하기 위해 두 개의 파일이있는 디렉토리를 고려하십시오.
$ ls -l
-rw-r--r-- 1 terdon terdon 0 Oct 9 18:16 file1
-rw-r--r-- 1 terdon terdon 0 Oct 9 18:16 file2
이제 변수를 foo *다음과 같이 설정하겠습니다 :
$ foo="foo *"
해당 이름의 파일이 있는지 확인하려고하면 어떻게됩니까?
$ if [ -e $foo ]; then echo "file exists"; else echo "no such file"; fi
file exists
변수가로 분할 된 foo과 *이후, 그리고 *모든 문자열과 일치하는 와일드 카드, 쉘은 그라는 파일을 알려줍니다 foo *exxists. 그러나 우리가 정확하게 인용하면, 이것은 일어나지 않습니다 :
$ if [ -e "$foo" ]; then echo "file exists"; else echo "no such file"; fi
no such file
그것은 요점을 설명하기위한 사소한 예였습니다. 그래도 rm대신 사용했다고 상상해보십시오 echo.
따라서 첫 번째 규칙은 항상 변수를 인용하십시오. 당신도 사용할 수 있습니다 "$foo"또는 "${foo}"그러나 어느 쪽이든 인용. 변수를 안전하게 사용하는 방법에 대한 자세한 내용은 다음 게시물을 살펴보십시오.
$ var="foo *"할 $ foo="foo *"? 당신은 var어디에도 사용하지 않습니다 .
$결국을 사용해서는 안됩니다 ! 변수 이름의 일부가 아닌 일반 문자로 취급됩니다.