쉘 스크립트에서 변수 참조

쉘 스크립트에서 변수 참조

쉘 스크립트에서 와 같은 변수를 정의하면 이를 와 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}"하고 절대로 $fooor 를 사용하지 마세요 ${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

변수는 fooand 로 분할되었으며 **모든 문자열과 일치하는 와일드카드이므로 쉘은 exxists라는 파일을 알려줍니다 foo *. 그러나 올바르게 인용하면 이런 일은 발생하지 않습니다.

$ if [ -e "$foo" ]; then echo "file exists"; else echo "no such file"; fi
no such file

그것은 요점을 설명하기 위한 사소한 예였습니다. 대신 rm에 내가 대신 사용했다면 상상해보십시오 echo.

따라서 첫 번째 규칙은 다음과 같습니다.항상 변수를 인용하십시오."$foo"또는 중 하나를 사용할 수 있지만 "${foo}"어느 쪽이든 인용할 수 있습니다. 변수를 안전하게 사용하는 방법에 대한 자세한 내용은 다음 게시물을 참조하세요.

관련 정보