Skip to content

2. 변수 치환(Variable Substitution)


변수의 이름은 자신이 갖고 있는 데이터의 값을 담는 그릇이다. 그 변수의 값을 참조하는 것을 변수 치환(Variable Substitution)이라고 한다.


만약 variable1이 변수 이름이라면 $variable1은 그 변수가 갖고 있는 데이터 아이템인 값을 나타낸다. 변수를 선언하거나 할당할 때, unset 될 때, export 될 때에만 $ 없이 쓰인다. 변수 할당은 =을 쓰거나, read 문에서 쓰이거나, 루프문의 처음에서 쓰인다.


참조되는 값을 ""(큰 따옴표)로 묶어도 변수 치환이 일어나는 것을 막지 못한다. 이를 부분적 쿼우팅(Partial Quoting)이나 약한 쿼우팅(Weak Quoting)이라고 한다. ''(작은 따옴표)를 쓰게 되면 변수 이름이 그냥 문자 그대로 해석되어 아무런 일도 일어나지 않는다. 이를 완전한 쿼우팅(Full Quoting)이나 강한 쿼우팅(Strong Quoting)이라고 한다.


$variable${variable}을 짧게 쓴 표현임에 주의한다. $variable이라고 써서 에러가 났을 경우에는 긴 형태로 써주면 해결될 수 있다.


예제) 변수 할당과 치환
#!/bin/bash

# 변수를 초기화할 때, = 양쪽에는 빈 칸이 들어가면 안 됨
a=375
hello=$a

echo hello # 변수 참조가 아니고 그냥 "hello"라는 문자열임

echo $hello
# 375
echo ${hello}
# 위와 같음

echo "$hello"
# 375
echo "${hello}"
# 위와 같음

hello="A B  C   D"

echo $hello
# A B C D

# echo $hello와 echo "$hello"는 다른 결과를 보여줌
# ""로 변수를 쿼우팅해 주면 공백문자가 보존됨
echo "$hello"
# A B  C   D

# ''로 변수를 쿼우팅해 주면 "$"가 문자 그대로 해석됨
# 변수 참조가 일어나지 않음
echo '$hello'
# $hello

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

# 여러 변수들을 공백문자로 구분하여 한 줄에서 세팅 가능
# 하지만 코드의 가독성이 떨어지고 문제가 발생할 수 있음
var1=variable1 var2=variable2 var3=variable3
echo "var1=$var1 var2=$var2 var3=$var3"
# var1=variable1 var2=variable2 var3=variable3

numbers="one two three"
other_numbers="1 2 3"

# 변수에 공백문자가 들어 있다면 쿼우팅을 해줘야 함
echo "numbers = $numbers"
echo "other_numbers = $other_numbers"

# 초기화가 안 된 변수는 널 값을 가짐
echo "uninitialized_variable = $uninitialized_variable"
# 선언만 하고 초기화 안 함
# 위처럼 널 값으로 세팅한 것과 같음
uninitialized_variable=
# 여전히 널 값을 가지고 있음
echo "uninitialized_variable = $uninitialized_variable"
# uninitialized_variable=

# 세트
uninitialized_variable=23
# 언세트
unset uninitialized_variable
# 여전히 널 값임
echo "uninitialized_variable = $uninitialized_variable"
# uninitialized_variable=

exit 0

References