본문 바로가기
Shell

Shell 변수 (variable)

by yororing 2024. 4. 30.

01 Shell 변수란

  • 쉘 변수는 숫자, 문자, 파일명 등 다양한 데이터 종류를 가질 수 있지만 할당될 시 문자열의 형태로만 할당됨
    • 즉, 셸 스크립트는 기본적으로 값의 타입이 없고 (untyped) 모두 문자열로 인식됨
  • 변수는 실제 데이터의 포인터 (pointer)
  • 쉘을 통해 변수를 생성, 값 할당, 값 해제 가능

1. 변수 이름

  • 구성: 영문자 (대소문자 구분), 숫자, 언더스코어 (_)
  • 보통 대문자로 작성하는 것이 원칙
  • 불가능: 숫자로 시작, 언더스코어 (_) 외의 특수 문자

2. 변수의 선언 (변수에 값 할당)

1) 일반적인 형태

# 스칼라 변수
변수=값
변수="값"
VAR1=value	# 예시
VAR2="value"	# 예시

# 배열 변수
변수=(값1 값2 값3 ...)
VAR_ARRAY=(value1 value2 value3)	# 예시

# 빈 변수
변수=
VAR_EMPTY=	# 예시
  • 변수=값 또는 변수="값"
    • 값은 큰따옴표/따옴표로 감싸주는 습관을 들이는 것이 이상
  • 배열 변수의 경우, 변수=(값1 값2 값3)
  • 값이 할당됨과 동시에 변수가 선언됨
  • = 양 옆에 공백이 없어야됨
  • 값을 명시 안할 시 빈 문자열이 할당
  • scalar 스칼라 변수와 array 배열 변수
    • scalar 스칼라 변수: 하나의 값만 가지고 있는 변수
    • array 배열 변수: 여러 개의 값을 가지고 있는 변수

2) 명령어의 결과를 할당하는 형태

변수=$(명령문)
RESULT=$(echo $0 | grep "^/")	# 예시

# legacy syntax
변수=`명령문`
RESULT=`echo $0 | grep "^/"`	# 예시

 

  • 특정 문자열 내에 특정 명령어의 결과를 포함시키고 싶을 경우 위와 같이 하면 됨. 
  • 백틱(`)을 사용한 legacy syntax는 문제 발생 가능하여 지양하는 것 (사용 안 하는 )을 권장

3. 변수에 접근 (변수에 할당된 값 참조)

  • $ 기호 사용하여 변수에 저장된 값에 접근 가능
  • $변수명, ${변수명}, $"{변수명}" 다 정상적으로 참조 가능하지만 $"{변수명}"을 권장
#---scalar 변수---
$변수명 or ${변수명} or $"{변수명}"

VAR=value
echo $VAR 	# 참조
echo ${VAR}	# 참조
echo $"{VAR}"	# 참조
value		# 출력값

#---array 변수---
${변수명[인덱스번호]}

VAR_ARRAY=(value1 value2 value3)
echo ${VAR_ARRAY[0]}			# 참조
value1					# 출력값
  • $"{변수명}"을 권장 이유: 가독성 + 참조하고자 하는 값이 담긴 변수를 정확히 지정 가능 + 공백 포함 시 유용함
#---------------------------------------
# 특정 상품의 제조사와 일련번호를 참조하여 "제조사_일련번호" 형태이 문자열로 만드는 예시
MANUFACTURER="IBM"
SERIAL_NUM="C202A5"

# 좋지 못한 코드
ITEM="$MANUFACTURER_$SERIAL_NUM"
echo "${ITEM}"	# C202A5

# 좋은 코드
ITEM=${MANUFACTURER}_${SERIAL_NUM}
echo "${ITEM}"	# IBM_C202A5

#---------------------------------------
str1="hello"
str2="world"
str3="hello world"
str4="hello    world"

# 좋지 못한 코드
echo ${str1} ${str2}	# hello world
echo ${str1}    ${str2}	# hello world
echo ${str3}		# hello world
echo ${str4}		# hello world
echo '${str4}'		# ${str4}

# 좋은 코드
echo "${str1} ${str2}"		# hello world
echo "${str1}    ${str2}"	# hello    world
echo "${str3}"			# hello world
echo "${str4}"			# hello    world
  • 배열 변수의 사용
    • 배열의 인덱스: 0부터 시작
    • 배열명[@]: 배열의 모든 원소를 의미
    • += 연산자: 배열의 원소 추가
    • 배열 초기화: unset 배열명
    • 특정 요소만 지우는 경우: unset 배열명[인덱스번호]
  • 예시
# 예시 - scalar 변수
VAR=value
echo $VAR 

# 출력값
value

# 예시 - array 변수
VAR_ARRAY=(value1 value2 value3)
echo ${VAR_ARRAY[0]}

# 출력값
value1

4. 읽기 전용 변수 (readonly)

  • 참조: 2024.04.29 - [Shell] - readonly (shell script 명령어)
  • readonly 명령어로 변수를 읽기 전용으로 설정 가능
  • 읽기 전용으로 설정된 변수는 변경 불가능
  • 읽기 전용은 쉘 프로세스가 종료될 때까지 영구적이고 해제 불가능
  • 변경이 필요한 변수는 읽기 전용으로 설정하면 안됨
readonly VAR=value
VAR=change 

# 출력값
VAR: is read only

5. 변수 삭제/초기화

  • unset 명령어로 변수 해제 가능
  • 변수 해제 시 변수에 저장되어 있던 값에 접근 불가
  • 읽기 전용 (readonly)으로 설정된 변수는 해제 불가
VAR=value
unset VAR
echo $VAR

# 출력값
(없음)

readonly VAR=value
unset VAR

# 출력값
unset: VAR: is read only

6. 예약 변수 (reserved variable)

HOME 사용자 홈 디렉토리
PATH 실행 파일을 찾을 경로
LANG 프로그램 사용 시 기본 지원되는 언어
PWD 사용자의 현재 작업 중인 디렉토리
FUNCNAME 현재 함수 이름
SECONDS 스크립트가 실행된 초 단위 시간
SHLVL 쉘 레벨 (중첩된 깊이)
SHELL 로그인해서 사용하는 쉘
PPID 부모 프로세스의 PID
BASH BASH 실행 파일 경로
BASH_ENC 스크립트 실행 시 BASH 시작 파일을 읽을 위치 변수
BASH_VERSION 설치된 BASH 버전
BASH_VERSINF0 BASH_VERSINFO[0] ~ BASH_VERSINFO[5] 배열로 상세 정보 제공
MAIL 메일 보관 경로
MAILCHECK 메일 확인 시간
OSTYPE 운영체제 종류
TERM 로그인 터미널 타입
HOSTNAME 호스트 이름
HOSTTYPE 시스템 하드웨어 종류
MACHTYPE 머신 종류
LOGNAME 로그인 이름
UID 사용자 UID
EUID su 명령에서 사용하는 사용자의 유효 아이디 값
USER  사용자의 이름
GROUPS 사용자 그룹 (/etc/passwd 값 출력)
HISTFILE history 파일 경로
HISTCONTROL 중복되는 명령에 대한 기록 유무
DISPLAY X 디스플레이 이름
IFS 입력 필드 구분자
VISUAL VISUAL 편집기 이름
EDITOR 기본 편집기 이름
COLUMNS 현재 터미널이나 윈도우 터미널의 컬럼 수
LINES 터미널의 라인 수
LS_COLORS ls 명령의 색상 관련 옵션
PS1 기본 프롬프트 변수 (기본값: bash/$)
PS2 보조 프롬프트 변수 (기본값: >), 명령을 "\"를 사용하여 명령 행을 연장 시 사용
PS3 쉘 스크립트에서 select 사용 시 프롬프트 변수 (기본값: #?)
PS4 쉘 스크립트 디버깅 모드의 프롬프트 변수 (기본값: +)
TMOUT 0이면 제한이 없으며 time 시간 지정 시 지정한 시간 이후 로그아웃

7. 특수 변수 (reserved variable)

$# 스크립트에 전달되는 인자들의 수
$$ 쉘 프로세스 번호 (PID)
$? 최근에 실행된 명령어, 함수, 스크립트 자식의 종료 상태
$! 최근에 실행한 백그라운드 명령의 PID 
$- 현재 옵션 플래그 
$_ 지난 명령의 마지막 인자로 설정된 특수 변수
$0 스크립트 파일의 이름
$1, $2, ... 스크립트로 전달된 인자들 (args[0], args[1], ...)
$* 모든 위치 매개변수를 담고 있는 단일 문자열
$@ $*와 비슷하나 $@sms "$1", ... "$N"을 의미 

참조

  1.  (개요) https://velog.io/@jinyongp/쉘-변수#:~:text=read-only%20명령어로%20변수,는%20변경이%20불가능하다.&text=읽기%20전용은%20쉘%20프로세스,적이고%20해제할%20수%20없다.
  2. https://m.blog.naver.com/hj_kim97/222586947801  
  3. https://mong9data.tistory.com/134
  4. ($"{변수명}" 참조) https://mong9data.tistory.com/134#---%--%--%EB%B-%--%EC%--%--%EB%AA%--%--%EB%-C%--%EC%-B%A-%--%--%-B%EB%B-%--%EC%--%--%EB%AA%--%-D%--%EC%-D%--%--%EA%B-%-C%EC%-E%A- 
  5. (특수 변수) https://sa2da-sac.tistory.com/18 
  6.  

'Shell' 카테고리의 다른 글

while문 사용법 (shell script)  (1) 2024.06.04
Shell Script 함수 만들기  (0) 2024.04.30
Shell, Shell Script, .sh란  (0) 2024.04.30
case문 사용법 (shell script)  (0) 2024.04.30
readonly (shell script 명령어)  (0) 2024.04.29