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)
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"을 의미
참조
(개요) https://velog.io/@jinyongp/쉘-변수#:~:text=read-only%20명령어로%20변수,는%20변경이%20불가능하다.&text=읽기%20전용은%20쉘%20프로세스,적이고%20해제할%20수%20없다.
https://m.blog.naver.com/hj_kim97/222586947801
https://mong9data.tistory.com/134
($"{변수명}" 참조) 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-
(특수 변수) https://sa2da-sac.tistory.com/18
공유하기
URL 복사 카카오톡 공유 페이스북 공유 엑스 공유