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

리눅스 쉘 스크립팅 변수 완전 정복 – declare 명령어와 속성 활용법 (파트 10)

리눅스 쉘 스크립팅 언어는 항상 뜨거운 관심을 받아온 주제였으며 앞으로도 그럴 것입니다. 쉘 스크립팅 언어는 마치 마법과 같아서, 다른 프로그래밍 언어에서처럼 손쉽게 프로그램을 작성할 수 있습니다. 하지만 무엇을 하고 있는지, 어떤 결과가 기대되는지에 대한 깊이 있는 이해가 반드시 필요합니다.

리눅스 쉘 스크립팅 변수 완전 정복 – declare 명령어와 속성 활용법 (파트 10)

지금까지 독자 여러분을 위해 작성한 모든 쉘 스크립팅 시리즈는 마지막 글인 "리눅스 변수의 이해"를 포함해 큰 호응을 얻었습니다. 이번 글에서는 지난 글의 내용을 한 단계 더 발전시켜 보겠습니다.

변수 속성(Attributes)

리눅스 환경의 각 변수에는 특정 옵션이 존재하며, 이를 '속성(attributes)'이라고 부릅니다. 이러한 옵션은 declare 명령어를 사용해 상황에 맞게 자유롭게 켜거나(On) 끌 수(Off) 있습니다.

변수 속성의 대표적인 예가 -i 스위치입니다. 이 스위치는 해당 변수에 정수(integer) 속성을 활성화합니다. 숫자가 아닌 값이 -i 스위치가 적용된 변수에 전달되더라도 오류 메시지를 출력하지 않고 정수 해석 결과로 '0'을 반환합니다. 아래 예제를 통해 더 명확하게 이해해 보겠습니다.

먼저 정수형 변수 bill을 121로 선언합니다.

admin@wsxdn.com:~$ declare -i bill=121

변수 bill의 값을 printf로 출력합니다.

admin@wsxdn.com:~$ printf "%d\n" "$bill" 

121

이번에는 변수 값을 문자열로 바꿔보겠습니다. bill 변수는 이미 선언되었으므로 다시 선언할 필요 없이 값만 변경하면 됩니다.

admin@wsxdn.com:~$ bill=tecmint

다시 변수 bill의 값을 printf로 출력합니다.

admin@wsxdn.com:~$ printf "%d\n" "$bill" 

0

오류 메시지 대신 '0'이 출력된 것에 주목하세요.

이미 선언된 변수의 속성을 확인하는 방법

admin@wsxdn.com:~$ declare -p bill 

declare -i bill="121"

여기서 -p(print의 약자) 스위치가 유용하게 사용됩니다.

변수의 속성을 끄는 방법

변수의 속성을 끄기(Off) 위해서는 스위치 바로 앞에 +(플러스) 기호만 붙이면 됩니다. 아래 예제를 통해 확인해 보겠습니다.

앞서 선언한 변수의 정수(integer) 속성을 해제합니다.

admin@wsxdn.com:~$ declare +i bill

변수의 값을 다시 확인합니다.

admin@wsxdn.com:~$ printf "%d\n" "$bill" 

bash: printf: bill: invalid number
0

이번에는 문자열 형식(%s)으로 변수 값을 출력합니다.

admin@wsxdn.com:~$ printf "%s\n" "$bill" 

tecmint

위 예제에서 볼 수 있듯이, bash 자체는 숫자가 아닌 값을 오류로 판단하지 못하지만 printf는 무엇이 숫자로 해석될 수 있고 무엇이 될 수 없는지를 구분해 처리합니다.

읽기 전용(Read-only) 변수

읽기 전용 메모리(ROM)라는 용어는 누구나 들어보셨을 것입니다. 그렇다면 읽기 전용 변수란 무엇이며, ROM과 어떤 유사점이 있을까요?

읽기 전용 메모리와 마찬가지로 읽기 전용 변수는 한 번 값이 할당되면 더 이상 변경할 수 없는 변수입니다. 그래서 '읽기 전용(read-only)'이라 불립니다. 해당 변수에는 새 값을 쓰거나, 편집하거나, 수정할 수 없습니다. 예제를 통해 살펴보겠습니다.

값이 "Tecmint.com"인 읽기 전용(-r) 변수 name을 선언합니다.

admin@wsxdn.com:~$ declare -r name="Tecmint.com"

선언된 변수의 값을 printf로 출력합니다.

admin@wsxdn.com:~$ printf "%s\n" "$name" 

Tecmint.com

변수의 값을 변경해 보겠습니다.

admin@wsxdn.com:~$ declare -r name="Avishek" 

bash: declare: name: readonly variable

위에서 설명한 대로, 읽기 전용 변수의 속성 역시 '+' 기호를 사용해 해제할 수 있습니다.

리눅스에서 변수 내보내기(Export)

쉘 스크립트 안에서 선언된 모든 쉘 변수는 스크립트가 실행되는 동안에만 유효합니다. 스크립트 외부에서는 해당 변수가 존재하지 않습니다. 이렇게 스크립트 밖에서도 변수를 사용할 수 있도록 만드는 과정을 '변수 내보내기(export)'라고 합니다.

declare -x(export) 스위치를 사용하면 변수를 쉘 외부로 내보낼 수 있으며, 이 스위치는 쉘에게 어떤 변수를 내보내고 싶은지 알려주는 역할을 합니다. 사용 방법은 다음과 같습니다.

admin@wsxdn.com:~$ declare -x variable="Constant_Value"

주의할 점은, 스크립트 실행 중 변수에 가해진 모든 변경 사항은 변수가 스크립트 외부로 내보내질 때 사라진다는 것입니다. 쉘 스크립팅에서 변수 내보내기는 매우 중요한 개념입니다.

만약 읽기 전용이면서 스크립트 외부에서도 사용 가능한 변수가 필요하다면 -r 스위치와 -x 스위치를 동시에 사용해야 합니다.

admin@wsxdn.com:~$ declare -rx variable="Constant_Value"

환경 변수(Environment Variables)

환경 변수는 프로그램과 그 프로그램을 호출하는 프로그램 사이에서 공유되는 변수입니다. 환경 변수는 내보낼 수 있지만, 속성을 직접 지정할 수는 없습니다.

위의 이론을 실습을 통해 이해해 보겠습니다. 여기 두 개의 스크립트 0.sh1.sh가 있습니다.

# 0.sh
#!/bin/bash 
declare -rx name=Tecmint 
bash 0.sh 
exit 0

두 번째 스크립트입니다.

# 1.sh
#!/bin/bash 
printf "%s\n" "$name" 
name=Tecmint.com 
printf "%s\n" "$name"
exit 0

여기서 일어나는 과정을 살펴보면, 변수(name)가 읽기 전용으로 선언되고 내보내진 직후 두 번째 스크립트가 호출됩니다.

두 번째 스크립트의 첫 번째 printf 문은 첫 번째 스크립트에서 내보낸 변수 값을 그대로 출력합니다. 그리고 두 번째 printf 문에서는 변수 'name'에 새로 할당된 값을 보여줍니다.

변수가 읽기 전용인데 어떻게 재할당이 가능한지 의문이 들 수 있습니다. 하지만 "스크립트 실행 중에 변수에 가해진 모든 변경 사항은 변수가 스크립트 외부로 내보내질 때 사라진다"는 규칙을 기억하면 납득할 수 있습니다.

참고: declare 명령어의 주요 스위치

declare 명령어는 아래의 모든 스위치와 이들의 조합을 지원합니다.

  1. -a : 배열(array)을 선언합니다.
  2. -f : 함수와 함수 정의를 표시합니다.
  3. -F : 함수 이름만 표시합니다.
  4. -r : 변수를 읽기 전용으로 선언합니다.
  5. -x : 변수를 내보내기 가능(exportable)으로 선언합니다.
  6. -i : 변수를 정수형으로 선언합니다.

오늘은 여기까지입니다. 다음 글에서는 'eval' 명령어를 활용한 변수 치환 방법과, 이 주제를 마무리하기 전에 bash에서 미리 정의되어 있는 변수들에 대해 다룰 예정입니다. 여러분이 쉘 스크립팅 심화 학습의 여정을 즐기고 계시길 바랍니다. 그때까지 Tecmint.com과 계속 함께하세요.