5.1. 변수 치환(Variable Substitution)

변수의 이름은 자신이 갖고 있는 데이타의 을 담는 그릇입니다. 그 변수의 값을 참조하는 것을 변수 치환(variable substitution)이라고 합니다.

$

변수 이름과 그 을 조심스럽게 살펴보죠. 만약에 variable1이 변수 이름이라면 $variable1은 그 변수가 갖고 있는 데이타 아이템인 을 나타냅니다. 변수를 선언하거나 할당할 때, unset 될 때, export될 때에만 $없이 쓰입니다. 변수 할당은 =을 쓰거나(var1=27 처럼), read 문에서 쓰이거나, 루프문의 처음에서 쓰입니다(for var2 in 1 2 3).

참조되는 값을 큰따옴표(" ")로 묶어도 변수 치환이 일어나는 것을 막지 못합니다. 이를 부분적 쿼우팅(partial quoting)이나 "약한 쿼우팅(weak quoting)"이라고 합니다. 작은따옴표를 쓰게 되면 변수 이름이 그냥 문자 그대로 해석되어 아무런 일도 일어나지 않습니다. 이를 완전한 쿼우팅(full quoting)이나 "강한 쿼우팅(strong quoting)"이라고 합니다. 더 자세한 사항은 6장을 참고하세요.

$variable${variable}을 짧게 쓴 표현임에 주의하세요. $variable라고 써서 에러가 났을 경우에는 긴 형태로 써주면 해결될 수도 있습니다(다음에 나오는 9.3절를 참고하세요).

예 5-1. 변수 할당과 치환

#!/bin/bash

# 변수: 할당과 치환

a=375
hello=$a

#-------------------------------------------------------------------------
# 변수를 초기화 할 때, = 양쪽에는 빈 칸이 들어가면 안 됩니다.

#  "VARIABLE =value" 라고 하면,
#+ 스크립트는 "VARIABLE" 명령어가 "=value"란 인자를 갖는것처럼 인식합니다.

#  "VARIABLE= value" 라고 하면,
#+ 스크립트는 "value" 명령어가 환경변수 "VARIABLE"을 ""로 세팅해서 
#+ 실행되는 것으로 인식합니다.
#-------------------------------------------------------------------------


echo hello    # 변수 참조가 아니고 그냥 "hello"란 문자열입니다.

echo $hello
echo ${hello} # 위와 똑같습니다.

echo "$hello"
echo "${hello}"

echo

hello="A B  C   D"
echo $hello
echo "$hello"
# 이제 echo $hello 와 echo "$hello" 는 다른 결과가 나옵니다.
# 변수를 쿼우팅해주면 공백문자가 보존됩니다.

echo

echo '$hello'
#  작은 따옴표로 변수를 쿼우팅해주면 "$"가 문자 그대로 해석되기 때문에
#+ 변수 참조가 일어나지 않습니다.

# 쿼우팅의 종류에 따라 달라지는 결과에 주목하세요.


hello=    # 널 값을 갖도록 세팅.
echo "\$hello (널 값) = $hello"
#  변수를 널 값으로 세팅하는 것과 unset 하는 것은 비록 결과는 같지만
#+ 엄연히 다릅니다(다음 참조).

# --------------------------------------------------------------

#  여러 변수들을 공백문자로 구분해서 한 줄에서 세트할 수 있습니다.
#  하지만 이렇게 하면 코드의 가독성이 떨어지고 
#+ 다른 시스템으로 이식할 수가 없을 수도 있기 때문에 조심해서 써야 됩니다.

var1=variable1  var2=variable2  var3=variable3
echo
echo "var1=$var1   var2=$var2  var3=$var3"

# 예전 버전의 "sh"에서는 문제가 생길수도 있습니다.

# --------------------------------------------------------------

echo; echo

numbers="one two three"
other_numbers="1 2 3"
# 변수에 공백문자가 들어 있다면 쿼우팅을 해줘야 합니다.
echo "numbers = $numbers"
echo "other_numbers = $other_numbers"
echo

echo "uninitialized_variable = $uninitialized_variable"
# 초기화 안 된 변수는 널 값을 갖습니다(아무 값도 없습니다).
uninitialized_variable=   #  선언만 하고 초기화 안함.
                          #+ (위에서처럼 널 값으로 세팅한 것과 똑같음).
echo "uninitialized_variable = $uninitialized_variable"
                          # 여전히 널 값을 갖고 있네요.

uninitialized_variable=23       # 세트.
unset uninitialized_variable    # 언세트.
echo "uninitialized_variable = $uninitialized_variable"
                                # 여전히 널 값입니다.

echo

exit 0

주의

초기화가 안 된 변수는 "null" 값을 갖는데, 이는 값이 할당 안 된 것이지 0 이라는 값을 갖는다는 이야기가 아닙니다! 값을 할당하기 전에 변수를 쓰게 되면 문제가 생길 수 있습니다.