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
-