
쉘 스크립트에서 와 같은 변수를 정의하면 이를 와 FOO=25
로 참조하는 것 사이에 차이가 있습니까 ?$FOO$
${FOO}$
답변1
대부분의 상황에서 $var
및 는 모두 ${var}
동일합니다. ( $
끝에는 a를 사용하면 안 된다는 점에 유의하세요 !)
중괄호가 필요한 한 가지 예는 연속 문자열에 변수를 넣어야 하는 경우입니다.
예:
var=hel
echo ${var}lo
출력됩니다 hello
.
답변2
주요 질문에 답하기 ${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"
or 를 사용 "${foo}"
하고 절대로 $foo
or 를 사용하지 마세요 ${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
다른 것으로 설정하여 변경할 수 있음)을 목록으로 만든 다음 목록의 각 요소는 다음과 같이 처리됩니다.글로브패턴을 적용하고 일치하는 파일이나 디렉터리로 확장합니다. 이는 다음과 같이 알려져 있습니다.분할+글로브운영자. 설명을 위해 다음과 같은 두 개의 파일이 있는 디렉터리를 생각해 보세요.
$ 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
and 로 분할되었으며 *
은 *
모든 문자열과 일치하는 와일드카드이므로 쉘은 exxists라는 파일을 알려줍니다 foo *
. 그러나 올바르게 인용하면 이런 일은 발생하지 않습니다.
$ if [ -e "$foo" ]; then echo "file exists"; else echo "no such file"; fi
no such file
그것은 요점을 설명하기 위한 사소한 예였습니다. 대신 rm
에 내가 대신 사용했다면 상상해보십시오 echo
.
따라서 첫 번째 규칙은 다음과 같습니다.항상 변수를 인용하십시오."$foo"
또는 중 하나를 사용할 수 있지만 "${foo}"
어느 쪽이든 인용할 수 있습니다. 변수를 안전하게 사용하는 방법에 대한 자세한 내용은 다음 게시물을 참조하세요.