이 글은 지속적으로 연재되고 있는 Bash 튜토리얼 시리즈의 일부입니다. 다른 프로그래밍 언어와 마찬가지로 Bash 역시 변수를 제공합니다.
Bash 변수는 프로그램이 실행되는 동안 필요한 정보를 임시로 저장하는 공간입니다.
Bash 변수 기본 문법
VARNAME=VALUE
주의: 변수를 할당할 때 등호(=) 기호 앞뒤에는 공백이 있으면 안 됩니다. VAR=VALUE처럼 작성하면 셸은 '='를 할당 기호로 인식하여 해당 명령을 변수 대입으로 처리합니다. 반면 VAR = VALUE처럼 공백을 넣으면 셸은 VAR을 하나의 명령어 이름으로 간주하고 이를 실행하려고 시도하기 때문에 오류가 발생합니다.
셸은 변수의 타입을 엄격하게 구분하지 않습니다. 변수에는 문자열, 정수, 실수 등 어떤 값이든 저장할 수 있습니다.
예제 1. 간단한 Bash 변수 할당 사용법
다음 스크립트는 LIST라는 변수를 만들고 "/var/opt/bin"이라는 값을 할당합니다. 변수에 접근하려면 변수 이름 앞에 $를 붙이기만 하면 되며, 그러면 해당 변수에 저장된 값을 얻을 수 있습니다.
$ cat sample.sh #!/bin/bash LIST="/var/opt/bin/" ls -l $LIST
위 스크립트를 실행하면 아래와 같이 /var/opt/bin 디렉터리의 내용이 긴 형식(long format)으로 출력됩니다.
$ ./sample.sh total 8 drwxrwsr-x 2 bin bin 4096 Jan 29 06:43 softwares drwxr-sr-x 5 root bin 4096 Sep 2 2009 llist
Bash 변수의 범위(Scope) – 지역 변수와 전역 변수
Bash에서는 변수를 별도로 선언할 필요가 없습니다. 하지만 아직 사용하지 않은 변수에 접근하더라도 경고나 오류 메시지가 나타나지 않습니다. 대신 아무런 값 없이 빈 값(blank)이 출력됩니다.
예제 2. Bash 변수의 빈 값 확인하기
$ cat var1.sh #!/bin/sh echo "Variable value is: $VAR1" VAR1="GEEKSTUFF" echo "Variable value is: $VAR1" $ ./var1.sh Variable value is: Variable value is: GEEKSTUFF
위 예제에서 볼 수 있듯이, 처음에는 변수가 빈 값을 가지다가 값을 할당한 후에는 정상적으로 값을 얻을 수 있습니다. export 명령은 대화형 셸(interactive shell)에서 변수를 내보낼 때 사용되며, 변수의 범위(scope)에 어떤 영향을 미치는지 보여줍니다.
예제 3. export 없이 사용하는 Bash 변수
대화형 셸에서 변수에 값을 할당한 뒤, 같은 변수를 셸 스크립트 내부에서 접근해 보겠습니다.
$ VAR2=LINUX $ cat var2.sh #!/bin/bash echo "VAR2=$VAR2" VAR2=UNIX echo "VAR2=$VAR2"
이제 위 스크립트를 실행해 보면 다음과 같습니다.
$ ./var2.sh VAR2= VAR2=UNIX
여전히 VAR2 변수는 빈 값을 반환합니다. 셸은 LINUX라는 값을 가진 VAR2 변수를 현재 셸에만 저장하기 때문입니다. var2.sh가 실행될 때 새로운 자식 셸(spawned shell)이 생성되어 스크립트를 실행하는데, 이 자식 셸에는 VAR2 변수의 값이 전달되지 않습니다. 따라서 변수를 다른 프로그램(셸 스크립트 포함)이 상속받도록 하려면 아래와 같이 export 명령으로 변수를 내보내야 합니다.
예제 4. Bash 변수 내보내기(Export)
$ export VAR2=LINUX $ cat var2.sh #!/bin/bash echo "VAR2=$VAR2" VAR2=UNIX echo "VAR2=$VAR2"
이제 위 스크립트를 실행해 보겠습니다.
$ ./var2.sh VAR2=LINUX VAR2=UNIX $ $ echo $VAR2 LINUX
이번에는 스크립트 var2.sh 실행 후에도 VAR2의 값이 LINUX로 유지되는 것을 확인할 수 있습니다. 단, 스크립트 안에서 변경된 값은 현재 셸에서 스크립트를 실행하지 않는 한 대화형 셸로 다시 전달되지 않습니다.
declare로 Bash 변수 선언하기
Bash에서 declare 문을 사용하면 변수에 할당되는 값을 제한할 수 있습니다. 즉, 변수의 속성을 강제로 지정하는 것이며, declare 문의 옵션을 통해 변수의 타입을 결정할 수 있습니다.
문법:
declare option variablename
- declare: 키워드
- option 종류:
- -r : 읽기 전용(read-only) 변수
- -i : 정수(integer) 변수
- -a : 배열(array) 변수
- -f : 함수(function) 관련 선언
- -x : 환경(environment)을 통해 이후 명령들에 변수를 내보내며 선언
예제 5. declare를 이용한 Bash 변수 선언
$ cat declar.sh #!/bin/bash declare -i intvar intvar=123 # Assigning integer value. echo $intvar intvar=12.3 #Trying to store string type value to an integer variable echo $intvar declare -r rovar=281 rovar=212 # Trying to change the readonly variable.
아래 실행 결과에서 볼 수 있듯이, 유효하지 않은 데이터를 변수에 할당하면 오류 메시지가 출력됩니다.
$ ./declar.sh 123 t.sh: line 6: 12.3: syntax error: invalid arithmetic operator (error token is ".3") 123 t.sh: line 11: rovar: readonly variable
Bash 전역 변수(Global Variables)
전역 변수는 환경 변수(environment variables)라고도 불리며, 모든 셸에서 사용할 수 있습니다. printenv 명령을 사용하면 모든 환경 변수를 확인할 수 있습니다.
$ printenv SHELL=/bin/bash HISTSIZE=1000 SSH_TTY=/dev/pts/1 HOME=/root LOGNAME=root CVS_RSH=ssh
Bash 지역 변수(Local Variables)
지역 변수는 코드 블록 내부에서만 접근 가능한 변수입니다. local은 지역 변수를 선언할 때 사용하는 키워드로, 함수 안에서 선언된 지역 변수는 해당 함수 블록 내에서만 유효합니다.
예제 6. 전역 변수와 지역 변수 비교
$ cat localvar.sh
#!/bin/bash
pprint()
{
local lvar="Local content"
echo -e "Local variable value with in the function"
echo $lvar
gvar="Global content changed"
echo -e "Global variable value with in the function"
echo $gvar
}
gvar="Global content"
echo -e "Global variable value before calling function"
echo $gvar
echo -e "Local variable value before calling function"
echo $lvar
pprint
echo -e "Global variable value after calling function"
echo $gvar
echo -e "Local variable value after calling function"
echo $lvar
위 스크립트를 실행해 보겠습니다.
$ sh t.sh Global variable value before calling function Global content Local variable value before calling function Local variable value with in the function Local content Global variable value with in the function Global content changed Global variable value after calling function Global content changed Local variable value after calling function
위 실행 결과를 보면, 지역 변수는 함수를 호출하기 전과 후에는 항상 빈 값만 출력됩니다. 지역 변수의 범위는 오직 함수 내부로 한정되며, 함수 밖으로 나오면 사라집니다. 반면 전역 변수는 함수 실행이 끝난 후에도 변경된 값이 그대로 유지되는 것을 확인할 수 있습니다.