리눅스 쉘 스크립팅 언어는 항상 뜨거운 관심을 받아온 주제였으며 앞으로도 그럴 것입니다. 쉘 스크립팅 언어는 마치 마법과 같아서, 다른 프로그래밍 언어에서처럼 손쉽게 프로그램을 작성할 수 있습니다. 하지만 무엇을 하고 있는지, 어떤 결과가 기대되는지에 대한 깊이 있는 이해가 반드시 필요합니다.
지금까지 독자 여러분을 위해 작성한 모든 쉘 스크립팅 시리즈는 마지막 글인 "리눅스 변수의 이해"를 포함해 큰 호응을 얻었습니다. 이번 글에서는 지난 글의 내용을 한 단계 더 발전시켜 보겠습니다.
변수 속성(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.sh와 1.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 명령어는 아래의 모든 스위치와 이들의 조합을 지원합니다.
- -a : 배열(array)을 선언합니다.
- -f : 함수와 함수 정의를 표시합니다.
- -F : 함수 이름만 표시합니다.
- -r : 변수를 읽기 전용으로 선언합니다.
- -x : 변수를 내보내기 가능(exportable)으로 선언합니다.
- -i : 변수를 정수형으로 선언합니다.
오늘은 여기까지입니다. 다음 글에서는 'eval' 명령어를 활용한 변수 치환 방법과, 이 주제를 마무리하기 전에 bash에서 미리 정의되어 있는 변수들에 대해 다룰 예정입니다. 여러분이 쉘 스크립팅 심화 학습의 여정을 즐기고 계시길 바랍니다. 그때까지 Tecmint.com과 계속 함께하세요.