컴퓨터공학 공부
컴퓨터공학 공부 다시 시작하기 20주차-쉘스크립트 조건문 이해하기, 쉘스크립트 반복문 이해하기, 서버 운영을 위한 쉘스크립트 예제(시스템 소프트웨어)
개발학생
2025. 3. 28. 16:28
반응형
1. 쉘스크립트 조건문 이해하기
연산자
- expr: 숫자 계산
-> 연산은 백틱`` 안이나 $() 안에 사용해야 함(백틱은 작은 따옴표 '와 다르며, $()은 최신 Bash에서 사용) - 연산자 *와 괄호()를 쓸 때는 앞에 역슬래시\를 추가해야 함
- 연산자와 숫자/변수/기호 사이에는 space를 넣어야 함
num=`expr \( 3 \* 5 \) / 4 + 7` #또는, num=$(expr \( 3 \* 5 \) / 4 + 7)
echo $num
기본 조건문
- 기본 if 구문: 실제로 사용할 때는 명령문 앞에 들여쓰기를 할 필요는 없고, then과 fi안에만 들어가 있으면 됨
if [조건]
then
명령문
fi
조건문 조건 작성 (필요할 때마다 참조하면 됨 \)
- 문자 비교
문자1 == 문자2 # 문자1 과 문자2가 일치
문자1 != 문자2 # 문자1 과 문자2가 일치하지 않음
-z 문자 # 문자가 null 이면 참
-n 문자 # 문자가 null 이 아니면 참
문자 == 패턴 # 문자열이 패턴과 일치
문자 != 패턴 # 문자열이 패턴과 일치하지 않음
- 수치 비교
# <, > 는 if 조건시 [[ ]] 를 넣는 경우 정상 동작하기도 하지만,
# 기본적으로 다음 문법을 사용하는 것을 권장
값1 -eq 값2 # 값이 같음(equal)
값1 -ne 값2 # 값이 같지 않음(not equal)
값1 -lt 값2 # 값1이 값2보다 작음(less than)
값1 -le 값2 # 값1이 값2보다 작거나 같음(less or equal)
값1 -gt 값2 # 값1이 값2보다 큼(greater than)
값1 -ge 값2 # 값1이 값2보다 크거나 같음(greater or equal)
값1 -gte 값2 # 값1이 값2보다 크거나
- 파일 검사
-e 파일명 # 파일이 존재하면 참
-d 파일명 # 파일이 디렉토리면 참
-h 파일명 # 심볼릭 링크파일
-f 파일명 # 파일이 일반파일이면 참
-r 파일명 # 파일이 읽기 가능이면 참
-s 파일명 # 파일 크기가 0이 아니면 참
-u 파일명 # 파일이 set-user-id가 설정되면 참
-w 파일명 # 파일이 쓰기 가능 상태이면 참
-x 파일명 # 파일이 실행 가능 상태이면 참
- 논리 연산
조건1 -a 조건2 # AND
조건1 -o 조건2 # OR
조건1 && 조건2 # 양쪽 다 성립
조건1 || 조건2 # 한쪽 또는 양쪽다 성립
!조건 # 조건이 성립하지 않음
true # 조건이 언제나 성립
false # 조건이 언제나 성립하지 않음
심화 조건문
- 기본 if 구문
if [ 조건 ]
then
명령문
fi
예시)
#!/bin/bash
if [[ $1 != $2 || -z $2 ]]
then
echo "입력한 값이 일치하지 않음"
exit
fi
- 기본 if 구문 (한 라인에 작성하는 방법)
if [ 조건 ]; then 명령문; fi
예시)
if [[ -z $1 ]]; then echo "인수를 입력하세요"; fi
- 기본 if/else 구문
if [ 조건 ]
then
명령문
else
명령문
fi
예시)
#!/bin/bash
ping -c 1 192.168.0.1 1> /dev/null
if [ $? == 0 ]
then
echo "게이트웨이 핑 성공!"
else
echo "게이트웨이 핑 실패!"
fi
2. 쉘스크립트 반복문 이해하기
반복문 문법
- 기본 for 구문
for 변수 in 변수값1 변수값2 ...
do
명령문
done
예시)
#!/bin/bash
for database in $(ls)
do
echo ${database[*]}
done
예시2)
#!/bin/bash
for database in $(ls); do
echo ${database[*]}
done
예시3)
#!/bin/bash
for database in $(ls); do echo ${database[*]}; done
- 기본 while 구문
while [ 조건문 ]
do
명령문
done
예시)
#!/bin/bash
lists=$(ls)
num=${#lists[@]}
index=0
while [ $num -ge 0 ]
do
echo ${lists[$index]}
index=`expr $index + 1`
num=`expr $num - $index`
done
반복문 예시: 현재 디렉토리에 있는 파일과 디렉토리 출력
#!/bin/bash
for database in $(ls)
do
echo $database
done
#!/bin/bash
for database in $(ls); do
echo $database
done
#!/bin/bash
for database in $(ls); do echo $database; done
3. 서버 운영을 위한 쉘스크립트 예제
압축 명령 tar
- 주요 옵션
x: 여러 파일의 묶음 상태 해제
c: 여러 파일을 묶음
v: 여러 파일의 묶음/해제 과정을 화면에 표시
z: gunzip(gzip으로 압축된 파일을 해제)을 사용
f: 파일 이름을 지정
- 압축 시 사용하는 옵션
tar -cvzf [압축된 파일 이름] [압축할 파일이나 폴더명]
- 압축을 풀 때 사용하는 옵션
tar -xvzf [압축 해제할 압축된 파일 이름]
백업하기
- [와 ] 사이에 공백이 없으면 오류가 발생하므로 주의
#!/bin/bash
# 입력된 인자가 2개인지 확인 (비어 있는 경우 -z 옵션 사용)
if [ -z "$1" ] || [ -z "$2" ]; then
# 사용법 출력
echo "usage: $0 sourcedir targetdir"
else
# 첫 번째 인자를 소스 디렉터리로 설정
SRCDIR=$1
# 두 번째 인자를 백업 저장 디렉터리로 설정
DSTDIR=$2
# 현재 날짜와 시간을 이용하여 백업 파일 이름 생성
BACKUPFILE=backup.$(date +%y%m%d%H%M%S).tar.gz
# 대상 디렉터리가 존재하는지 확인
if [ -d "$DSTDIR" ]; then
# tar 명령어로 소스 디렉터리를 압축하여 대상 디렉터리에 저장
tar -cvzf "$DSTDIR/$BACKUPFILE" "$SRCDIR"
else
# 대상 디렉터리가 없으면 생성
mkdir "$DSTDIR"
# tar 명령어로 소스 디렉터리를 압축하여 대상 디렉터리에 저장
tar -cvzf "$DSTDIR/$BACKUPFILE" "$SRCDIR"
fi
fi
로그 파일 정리하기
# -type f: 파일 타입 지정해서 파일명 검색(f는 일반 파일)
find . -type f -name '검색어' -exec bash -c "명령어1; 명령어2; 명령어3;" \;
예시)
#!/bin/bash
# 현재 디렉터리(.)에서 파일(-type f) 중, 확장자가 .log인 파일을 찾음
find . -type f -name '*.log' -exec bash -c "
# 파일 이름을 출력
echo '처리 중: ' {};
# 해당 파일의 크기를 출력
du -h {};
# 해당 파일을 백업 디렉터리로 이동
mv {} ~/backup/;
" \;
#!/bin/bash
# 로그 파일이 저장된 디렉터리
LOGDIR=/var/log
# 로그 파일을 gzip으로 압축할 기준 날짜 (1일 이상된 파일 압축)
GZIPDAY=1
# gzip으로 압축된 파일을 삭제할 기준 날짜 (2일 이상된 파일 삭제)
DELDAY=2
# 로그 디렉터리로 이동
cd $LOGDIR
echo "cd $LOGDIR"
# 1일 이상된 로그 파일(.log.?)을 찾아 gzip으로 압축
sudo find . -type f -name '*.log.?' -mtime +$GZIPDAY -exec bash -c "gzip {}" \; 2> /dev/null
# 2일 이상된 압축된 로그 파일(.gz)을 찾아 삭제
sudo find . -type f -name '*.gz' -mtime +$DELDAY -exec bash -c "rm -f {}" \; 2> /dev/null
반응형