cmod.ify
[LINUX] Shell Programming(Script) 본문
728x90
반응형
1. 개요
- 정의: Unix, Linux, POSIX(MacOS 포함) 환경에서 사용하는 명령어와 프로그래밍 요소(if, for 등)가 결합된 인터프리터 기반 스크립트 언어임.
- 특징: 컴파일 과정 없이 한 줄씩 읽어 실행하며, 시스템 자동화 및 일괄 처리에 강력함.
2. 주요 쉘 종류
- sh: 쉘 스크립트의 기본이 되는 본 쉘(Bourne Shell).
- bash: 리눅스 표준 쉘. 본 쉘 기반에 C쉘과 코온 쉘의 기능을 통합함.
- ksh: 유닉스에서 주로 사용되는 코온 쉘.
- csh / tcsh: C언어와 유사한 문법을 가진 쉘.
- zsh: bash, ksh, tcsh의 장점을 모아 개선한 확장 쉘. 최근 MacOS 기본 쉘로 채택됨.
3. 기본 문법 및 실행
생성 및 작성
- 확장자는 .sh를 사용함.
- 파일 첫 줄에 #!/bin/bash (쉬뱅, Shebang)를 작성하여 실행 쉘을 지정함.
#!/bin/bash
echo "hello world"
실행 방법
- 쉘을 통한 실행: 파일 읽기 권한만 있으면 됨.
- bash myshell.sh 또는 sh myshell.sh
- 직접 실행: 실행 권한(x) 부여 후 경로를 지정해 실행함.
- chmod 751 myshell.sh
- ./myshell.sh (현재 디렉토리가 PATH에 없으므로 ./ 필수)
4. 변수와 함수
변수 선언 및 사용
- 변수명=값 형태로 선언 (등호 앞뒤 공백 금지).
- 사용 시에는 $변수명 또는 ${변수명} 사용.
#!/bin/bash
lang="Korean"
echo "I can speak $lang"
함수(Function)
- function 이름() { 내용 } 형태로 정의함.
- 파라미터는 $1, $2 등 위치 매개변수로 전달받음.
#!/bin/bash
function print(){
echo $1
}
print "I can speak Korean"
5. 변수 종류 및 매개변수
변수 범위
- 전역변수: 스크립트 전체에서 사용 가능.
- 지역변수: 함수 내부에서만 사용 가능.
- 환경변수: 시스템에 예약된 변수 (HOME, PATH, PWD, USER, HOSTNAME 등).
위치 매개변수
- $0: 실행된 스크립트 이름.
- $1, $2: 전달된 인자(파라미터). 10번부터는 ${10} 사용.
- $*: 모든 인자를 하나의 문자열로 취급.
- $@: 모든 인자를 각각의 개별 문자열로 취급.
- $#: 매개변수의 총 개수.
특수 매개변수
- $$: 현재 프로세스의 PID.
- $?: 최근 실행된 명령어의 종료 상태 (0은 성공, 이외는 에러).
- $!: 최근 백그라운드에서 실행된 명령의 PID.
- $-: 현재 설정된 쉘 옵션 플래그.
6. 매개변수 확장 및 치환
확장 변경자 (초기화 및 조건부 할당)
| 문법 | 설명 |
| ${var-val} | 변수 미설정 시 val 사용 |
| ${var:-val} | 변수 미설정 또는 null 시 val 사용 |
| ${var=val} | 변수 미설정 시 val을 변수에 저장 후 사용 |
| ${var:?msg} | 변수 미설정/null 시 에러 메시지 출력 후 종료 |
| ${var:시작:길이} | 문자열 부분 추출 |
패턴 치환 및 제거
- ${var#패턴}: 앞부분부터 짧게 일치하는 패턴 제거.
- ${var##패턴}: 앞부분부터 길게 일치하는 패턴 제거.
- ${var%패턴}: 뒷부분부터 짧게 일치하는 패턴 제거.
- ${var%%패턴}: 뒷부분부터 길게 일치하는 패턴 제거.
- ${var/패턴/변경}: 첫 번째 패턴 치환.
- ${var//패턴/변경}: 모든 패턴 치환.
- ${#var}: 문자열 길이 반환.
7. 활용 예시 (문자열 조작)
FILE_PATH="/etc/nova/nova.conf"
# 디렉토리 경로만 추출 (% 사용)
echo ${FILE_PATH%/*} # 결과: /etc/nova
# 파일 이름만 추출 (## 사용)
echo ${FILE_PATH##*/} # 결과: nova.conf
# 문자열 치환
OS_TYPE="Redhat Linux Ubuntu Linux"
echo ${OS_TYPE//Linux/OS} # 결과: Redhat OS Ubuntu OS
8. 조건문 (if, case)
1) if문
- 기본 형식: if, then, elif, else, fi 구조를 가짐.
- 특이사항: 조건식 [ ] 사이에는 반드시 공백이 있어야 함.
var1=10; var2=20
if [ $var1 = $var2 ]
then
echo "True"
else
echo "False"
fi
# 문자열 길이 체크 (-z: zero)
value=""
if [ -z $value ]; then
echo "문자열이 비어있음"
fi
2) case문
- 기본 형식: 특정 변수의 값에 따라 다른 명령을 수행하며, esac로 종료함.
- 패턴: 각 조건 끝에는 )를 붙이고, 실행문 끝에는 ;;를 붙임. *는 나머지 모든 경우(default)를 의미함.
case $1 in
start)
echo "서비스 시작" ;;
restart)
echo "서비스 재시작" ;;
*)
echo "사용법: $0 {start|restart}" ;;
esac
9. 반복문 (for, while)
1) for문
- 리스트 기반: 리스트나 배열의 요소를 하나씩 꺼내어 반복함.
- 범위 지정: {시작..끝} 문법을 통해 숫자 범위를 지정할 수 있음
# 기본 리스트
for num in 1 2 3; do echo $num; done
# 숫자 범위 {1..5}
for num in {1..5}; do echo $num; done
# 배열 사용
array=("apple" "banana")
for fruit in ${array[@]}; do echo $fruit; done
# C언어 스타일
for ((num=0; num<3; num++)); do echo $num; done
2) while문
- 조건 기반: 조건식이 참(True)인 동안 계속해서 반복 수행함.
num=0
while [ $num -lt 3 ]
do
echo $num
num=$((num+1)) # 증감 연산
done
10. 연산자 정리
숫자 비교 연산자
| 연산자 | 의미 | 비고 |
| -eq | 같음 (equal) | [ $a -eq $b ] |
| -ne | 같지 않음 (not equal) | |
| -gt | 크다 (greater than) | |
| -lt | 작다 (less than) | |
| -ge | 크거나 같다 (greater or equal) | |
| -le | 작거나 같다 (less or equal) |
문자열 및 논리 연산자
- 문자열: -z(길이 0), -n(길이 0 아님), =, !=, <, >
- 논리: -a(AND), -o(OR) / &&, ||
- [ ] 안에서는 -a, -o 사용.
- &&, ||를 쓸 때는 [[ ]]를 쓰거나 [ ] && [ ] 형태로 연결함.
파일 및 디렉토리 연산자
- 유형 확인: -d(디렉토리), -f(일반 파일), -L(심볼릭 링크)
- 권한 및 상태: -r(읽기), -w(쓰기), -x(실행), -s(크기가 0보다 큼)
- 소유권: -O(소유자 일치), -G(그룹 일치)
파일 비교 연산자
- 파일1 -nt 파일2: 파일1이 파일2보다 최신(newer than)이면 참.
- 파일1 -ot 파일2: 파일1이 파일2보다 오래된(older than) 것이면 참.
- 파일1 -ef 파일2: 두 파일이 동일한 파일(equal file, 하드 링크 등)이면 참.
# 실습 예시: 심볼릭 링크와 파일 크기 체크
FILE="/etc/localtime"
if [ -L $FILE ]; then
echo "이것은 심볼릭 링크입니다."
fi
touch sample.txt
if [ -s sample.txt ]; then
echo "내용이 있는 파일입니다."
else
echo "빈 파일입니다."
fi
11. 정규 표현식 (Regular Expression)
1) 개요
- 정의: 리눅스나 유닉스 환경에서 텍스트 검색 및 추출에 특별한 의미를 부여하는 문자들과 메타 문자들의 집합임.
- 장점: 방대한 텍스트 파일 내에서 특정 패턴을 빠르게 찾고 편집할 때 매우 효율적임.
2) 주요 메타 문자 (Meta Characters)
| 문자 | 설명 |
| . | 줄바꿈을 제외한 임의의 한 문자 |
| ? | 앞의 문자가 0번 또는 1번 나타남 |
| * | 앞의 문자가 0번 이상 반복 |
| + | 앞의 문자가 1번 이상 반복 (반드시 하나 이상) |
| {N} | 정확히 N번 반복 |
| {N,} | N번 이상 반복 |
| {N, M} | N번 이상 M번 이하 반복 |
| ^ | 라인의 시작을 의미 (목록 안 [^ ]에선 부정의 의미) |
| $ | 라인의 끝을 의미 |
| ^$ | 빈 줄(공백 라인) 의미 |
| [ ] | 문자들의 집합 중 하나와 일치 |
| \ | 특수 문자를 일반 문자로 해석 (Escape) |
3) 문자 클래스 (Character Classes)
grep 등에서 사용할 때는 [[:클래스명:]] 형태로 사용함.
- [:alnum:]: 알파벳과 숫자
- [:alpha:]: 알파벳
- [:digit:]: 숫자 (0-9)
- [:lower:] / [:upper:]: 소문자 / 대문자
- [:space:]: 공백(스페이스, 탭, 줄바꿈 등)
- [:punct:]: 문장 부호(구두점)
12. 정규 표현식 실습 (grep 활용)
실습 파일(expression.txt)을 대상으로 다양한 패턴 검색을 수행함. 확장 메타 문자나 클래스 사용 시 -E (Extended regexp) 옵션을 사용하는 것이 좋음.
주요 실습 예제
1. C로 시작하고 U로 끝나는 3글자 조회
grep 'C.U' expression.txt
# 결과: CPU model is Intel(R)...
2. q로 시작해서 ?로 끝나는 단어 (중간에 소문자만 존재)
- ?는 메타 문자이므로 일반 문자로 인식시키기 위해 \를 붙임.
grep -E 'q[[:lower:]]*\?' expression.txt
# 결과: Do you have any questions?
3. '-' 뒤에 숫자 '2'가 1번 이상 나오고 다시 '-'가 나오는 패턴
grep -E '\-2+\-' expression.txt
# 결과: phone: 010-2222-5668
4. 라인 시작이 알파벳 5글자이고 바로 뒤에 ':'이 오는 경우
grep -E '^[[:alpha:]]{5}:' expression.txt
# 결과: phone: 010-2222-5668
5. 라인 시작이 알파벳 5글자 이상이고 뒤에 공백이 오는 경우
grep -E '^[[:alpha:]]{5,}[[:space:]]' expression.txt
# 결과: Today is..., Current..., Memory...
13. 스크립트에서 많이 사용하는 명령어
1) grep (텍스트 검색)
- 개요: 파일 내에서 특정 패턴을 가진 문자열을 조회할 때 사용함.
- 형식: grep [옵션] 패턴 [파일경로]
- 주요 옵션:
- -E: 확장 정규 표현식 사용.
- -e: 여러 개의 정규 표현식을 동시에 사용할 때 유용함 (-e 패턴1 -e 패턴2).
- -f: 패턴을 파일에서 읽어옴.
- -F: 패턴을 정규 표현식이 아닌 단순 문자열로 처리함.
2) find (파일 찾기)
- 개요: 특정 조건(이름, 권한, 시간 등)에 맞는 파일을 디렉토리 트리에서 검색함.
- 사용 예시:
- 이름으로 검색: find /etc -name chrony.conf
- 권한이나 시간 검색: 특정 접근 권한이나 수정 시간을 기준으로 정교한 검색이 가능함.
3) awk (데이터 추출 및 리포팅)
- 개요: 텍스트를 필드(열) 단위로 나누어 처리하는 강력한 도구임.
- 특징: CSV 파일처럼 구분자로 나누어진 데이터에서 특정 열($1, $2 등)만 추출할 때 주로 쓰임.
4) sed (스트림 에디터)
- 개요: 파일을 열지 않고도 텍스트를 검색, 교체, 삭제할 수 있는 편집기임.
- 치환 예시: sed 's/찾을문자열/바꿀문자열/' 파일명
- #PermitRoot를 찾아 주석(#)을 제거하는 설정 자동화에 많이 활용됨.
# 주석 해제 후 결과 확인 sed 's/#PermitRoot/PermitRoot/' /etc/ssh/sshd_config | grep '^PermitRoot'
5) date (날짜 및 시간)
- 개요: 시스템의 현재 날짜와 시간을 출력하거나 설정함.
- 형식: date +포맷
- 자주 쓰는 표현:
- date -d yesterday: 어제 날짜 출력.
- date '+%Y-%m-%d %I:%M %p': 연-월-일 시:분 오전/오후 형식으로 출력.
14. 쉘 스크립트 작성 팁
- 파이프라인(|) 활용: 앞선 명령어의 결과(stdout)를 다음 명령어의 입력(stdin)으로 바로 넘겨 처리 효율을 높임.
- 디버깅: 스크립트 실행 시 bash -x 스크립트명을 사용하면 실행 과정을 한 줄씩 추적할 수 있음.
728x90
반응형
'BASIC > LINUX' 카테고리의 다른 글
| [LINUX] Windows에서 Linux로 OS 변경하기 - MSI (0) | 2026.01.21 |
|---|---|
| [LINUX] 사용자 계정 생성 스크립트 (0) | 2026.01.16 |
| [LINUX] 서버 구축 및 데이터베이스 설치 가이드 (1) | 2026.01.15 |
| [LINUX] Programming Language 개발 환경 구축 (1) | 2026.01.15 |
| [LINUX] Virtual Box 전용 네트워크 구성 (0) | 2026.01.14 |