쉘 스크립트에서 변수 참조


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.