Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

Bash 변수 완벽 가이드 – 전역 변수와 지역 변수 실전 예제 6가지

Bash 변수 완벽 가이드 – 전역 변수와 지역 변수 실전 예제 6가지이 글은 지속적으로 연재되고 있는 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

위 실행 결과를 보면, 지역 변수는 함수를 호출하기 전과 후에는 항상 빈 값만 출력됩니다. 지역 변수의 범위는 오직 함수 내부로 한정되며, 함수 밖으로 나오면 사라집니다. 반면 전역 변수는 함수 실행이 끝난 후에도 변경된 값이 그대로 유지되는 것을 확인할 수 있습니다.