쉘 스크립트에서 변수 참조


10

나는이 같은 변수를 정의하면 쉘 스크립트에서 FOO=25, 그것을 참조하는 사이에 차이가 $FOO$와 ${FOO}$?


2
$결국을 사용해서는 안됩니다 ! 변수 이름의 일부가 아닌 일반 문자로 취급됩니다.
— 바이트 사령관

답변:


16

대부분의 상황에서 모두 $var와 ${var}동일합니다. ( $끝에 a 를 사용해서는 안됩니다 !)

중괄호가 필요한 한 가지 예는 연속 문자열에 변수를 넣어야 할 때입니다.

예:

var=hel
echo ${var}lo

출력 hello합니다.


11

주요 질문에 대답하기 위해, ${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어디에도 사용하지 않습니다 .
— Joe

@ 조 오, 슬픔! 예, 물론 지적 해 주셔서 감사합니다. 그건 그렇고 편집을 제안하여 이러한 실수를 수정하십시오. 이런 종류의 일은 매우 권장됩니다. 정확하게 이와 같은 바보 같은 오류를 피하십시오.
— terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.