Skip to content

5. 특수한 변수 타입


지역 변수(Local Variable)는 코드 블럭이나 함수에서만 나타난다.


환경 변수(Envirment Variable)는 셸의 동작과 사용자 인터페이스에 영향을 미치는 변수이다.


Note

일반적인 상황에서 가가 프로세스는 자신이 참조할 정보들을 담고 있는 변수들의 그룹인 환경이란 것을 가지고 있다. 이런 관점에서 보면, 셸도 다른 프로세스들과 다를 바가 없다.


셸은 자신이 시작될 때마다 자신의 환경 변수에 대응하는 셸 변수를 만들어 낸다. 셸 변수를 업데이트하거나 새롭게 추가하면 셸은 자신의 환경 변수를 업데이트하고 셸의 모든 자식 프로세스(셸에서 실행시킨 명령어들)는 그 환경을 물려 받게 된다.


환경용으로 할당된 공간은 제한되어 있다. 환경 변수를 너무 많이 만들거나 한 환경 변수가 공간을 지나치게 사용한다면 문제가 생길 수 있다.


만약 스크립트가 환경 변수를 세트하면 그 변수는 export 되어야 한다. 즉, 그 스크립트에 해당하는 환경으로 보고되어야 한다는 뜻이다.


Note

스크립트는 변수를 오직 자신의 자식 프로세스에게만 export 할 수 있다. 즉, 자신이 만들어낸 명령어나 프로세스들만 적용을 받는다. 명령어줄에서 실행된 스크립트는 특정 변수를 명령어줄 환경으로 거꾸로 export 할 수 없다. 자식 프로세스는 자신을 만들어낸 부모 프로세스에게 특정 변수를 거꾸로 export 할 수 없다.


위치 매개변수(Positional Parameter)는 명령어줄에서 스크립트로 넘어온 인자들을 의미한다. $0, $1, $2, ... 이런 식으로 표현되는데 $0은 스크립트의 이름 그 자체를 나타내고, $1은 첫 번째 인자를, $2는 두 번째 인자를 나타내는 식이다. $9 다음의 인자는 ${10}, ${11}, ${12}처럼 {}(중괄호)로 묶어줘야 한다.


예제) 위치 매개변수
#!/bin/bash

echo "스크립트 이름은 \"$0\"."
# 스크립트 이름은 "/Users/SAEMC/test.sh".
echo "스크립트 이름은 \"$(basename $0)\"."
# 스크립트 이름은 "test.sh".

# 테스트 할 변수를 쿼우트 해줌
if [ -n "$1" ]; then
    echo "첫 번째 매개변수는 $1"
fi
# 첫 번째 매개변수는 1

if [ -n "$2" ]; then
    echo "두 번째 매개변수는 $2"
fi
# 두 번째 매개변수는 2

# ...

if [ -n "${10}"]; then
    echo "열 번째 매개변수는 ${10}"
fi
# 열 번째 매개변수는 10

exit 0


어떤 스크립트들은 자신이 불린 이름에 따라 다르게 동작할 수도 있다. 이런 식의 동작을 원한다면 스크립트 안에서 자기가 어떻게 불렸는지를 나타내는 $0을 확인하면 된다. 스크립트가 어떤 이름으로 불리든지 간에 $0은 그 이름을 정확하게 심볼릭 링크하고 있기 때문이다.


명령어줄 매개변수를 예상하고 있는 스크립트가 매개변수 없이 불린다면 널 값이 할당되어 원하지 않는 결과를 가져온다. 이런 상황을 피하는 한 가지 방법은 위치 매개변수를 변수에 할당하는 문장에서 양쪽에 똑같은 아무 문자나 붙이면 된다.


예제) 위치 매개변수 없이 실행할 때
#!/bin/bash

# 위치 매개변수가 비어있더라도 에러를 막아줌
variable1_=$1_

critical_argument01=$variable1_

# 실제로 변수를 쓸 곳에서 이처럼 해주면 에러 방지용 문자가 잘림
variable1_=${variable1_/_/}

# 좀 더 확실한 방법은 원하는 위치 매개변수가 넘어 왔는지 확인
if [ -z "$1" ]; then
    exit $POS_PARAMS_MISSING
fi


shift 명령어는 위치 매개변수를 왼쪽으로 한 단계씩 이동시킨다. 원래의 $1은 다음 단계의 위치 매개변수로 바뀌어 없어지지만, $0은 바뀌지 않는다.


예제) shift 쓰기
#!/bin/bash

# 스크립트의 이름을 shft 등의 이름으로 변경
# /bin/bash ./shft a b c def 23과 같은 식으로 인자를 넘김

# 모든 위치 매개변수를 다 쓸 때까지 반복
until [ -z "$1" ]; do
    echo -n "$1 "
    shift
done
echo
# a b c def 23

exit 0

References