반응형
쉘 스크립트
- 쉘을 사용해서 프로그래밍을 할 수 있다
- 서버 작업 자동화 및 운영을 위해 익혀둘 필요가 있다
- 쉘 명령어를 기본으로 하되 몇가지 문법이 추가된 형태
기본 문법
- 쉘 스크립트는 파일로 작성 후, 파일 실행
- 파일의 가장 위의 첫 라인은 #!/bin/bash 로 시작
- 쉘 스크립트 파일은 실행 권한을 가지고 있어야 한다
- 일반적으로 파일이름.sh 와 같은 형태로 파일 이름을 작성한다
Hello World 출력
#!/bin/bash
echo 'Hello World'
주석
#로 주석처리
변수
- 선언
- 변수명=데이터
- 변수명=데이터 사이에 띄어쓰기는 허용되지 않는다
- 사용
- $변수명 으로 사용된다
#!/bin/bash
name="DabinLim"
age=29
mycareer="IT"
echo $name $age $mycareer
리스트 변수(배열)
- 선언
- 변수명=(데이터1 데이터2 데이터3)
- 사용
- ${변수명[인덱스번호]}
#!/bin/bash
arrays=("hello" "world" "shell")
echo ${arrays[0]} # 배열의 첫번째 인덱스
echo ${arrays[1]}
echo ${arrays[@]} # 배열의 모든 데이터
echo ${arrays[*]} # 배열의 모든 데이터
echo ${#arrays[@]} # 배열의 크기 출력
사전에 정의된 지역변수
- $$: 쉘의 프로세스 번호
- $0: 쉘스크립트 이름
- $1 ~ $9: 명령줄 인수
- $*: 모든 명령줄 인수 리스트
- $#: 인수의 개수
- $?: 최근 실행한 명령어의 종료 값
- 0 (성공), 1 ~ 124 (에러)
- 126 (파일이 실행가능하지 않음)
- 128 ~ 255 (시그널 발생)
연산자
expr: 숫자 계산
expr를 사용하는 경우 백팃을 사용해야 한다
연산자 *와 괄호() 앞에는 \ 와 같이 사용
num=`expr \( 20 + 20 \) / 8 - 8`
echo $num
조건문 문법
- 기본 if 구문
if [$1 != $2]
then
echo "different argument"
exit
else
echo "same argument"
exit
fi
# 한줄에 작성하는 경우
if [조건]; then 명령; fi
문자 비교
문자1 == 문자2 # 문자1 과 문자2가 일치
문자1 != 문자2 # 문자1 과 문자2가 일치하지 않음
-z 문자 # 문자가 null이면 true
-n 문자 # 문자가 null이 아니면 true
값1 -eq 값2 # 값이 같음 (equel)
값1 -ne 값2 # 값이 같지 않음(not equel)
값1 -lt 값2 # 값1이 값2보다 작음 (less than)
값1 -le 값2 # 값1이 값2보다 작거나 같음 (less or equel)
값1 -gt 값2 # 값1이 값2보다 큼 (greater than)
값1 -ge 값2 # 값1이 값2보다 크거나 같음 (greater or equel)
파일 검사
-e 파일명 # 파일이 존재하면 true
-d 파일명 # 파일이 디렉토리면 true
-h 파일명 # 심볼릭 링크 파일
-f 파일명 # 파일이 일반 파일이면 true
-r 파일명 # 파일이 읽기 가능이면 true
-s 파일명 # 파일 크기가 0이 아니면 true
-u 파일명 # 파일이 set-user-id가 설정되면 true
-w 파일명 # 파일이 쓰기 가능 상태면 true
-x 파일명 # 파일이 실행 가능 상태면 true
논리 연산
조건1 -a 조건2 # AND
조건1 -o 조건2 # OR
반복문
기본 for 구문
for database in $(ls)
do
echo $database
done
# 한줄에 작성
for database in $(ls); do echo $database; done
while 구문
lists=$(ls)
num=${#lists[@]}
index=0
while [$num -ge 0]
do
echo ${lists[$index]}
index=`expr $index + 1`
num=`expr $num - 1`
done
백업하기
#!/bin/bash
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 -cvzf $DSTDIR/$BACKUPFILE $SRCDIR # 압축파일 생성
else
mkdir $DSTDIR # 없으면 디렉토리 만들고
tar -cvzf $DSTDIR/$BACKUPFILE $SRCDIR # 압축 파일 생성
fi
fi
압축 명령 tar
- 주요 옵션
x: 묶음을 해제
c: 파일을 묶음
v: 묶음/해제 과정을 화면에 표시
z: gunzip을 사용
f: 파일 이름을 지정
- 압축시 주로 사용하는 옵션
tar -cvzf [압축된 파일 이름] [압축할 파일이나 폴더명]
- 압축을 풀때 주로 사용하는 옵션
tar -xvzf [압축 해제할 압축 아카이브 이름]
로그 파일 정리하기
#!/bin/bash
LOGDIR=/var/log
GZIPDAY=1
DELDAY=2
cd $LOGDIR
echo "cd $LOGDIR"
# 로그파일을 찾아서 오늘 날짜에 하루 더한 날짜가 지났으면 압축
sudo find . -type f -name '*log.?' -mtime +$GZIPDAY -exec bash -c "gzip {}" \;
# 압축파일을 찾아서 오늘 날짜에 이틀 더한 날짜가 지났으면 삭제
sudo find . -type f -name '*gz' -mtime +$DELDAY -exec bash -c "rm -f {}" \;
반응형
'Computer Science' 카테고리의 다른 글
컴퓨터 구조와 레지스터 (0) | 2022.01.21 |
---|---|
Pthread (0) | 2022.01.19 |
시스템 프로그래밍 - 프로세스 관리 (0) | 2022.01.10 |
시스템 프로그래밍 핵심 기술 (0) | 2022.01.09 |
시스템 프로그래밍 - 쉘 사용법 (0) | 2022.01.06 |
댓글