본문 바로가기
Computer Science

쉘 스크립트

by 개발자 데이빗 2022. 1. 14.

쉘 스크립트

  • 쉘을 사용해서 프로그래밍을 할 수 있다
  • 서버 작업 자동화 및 운영을 위해 익혀둘 필요가 있다
  • 쉘 명령어를 기본으로 하되 몇가지 문법이 추가된 형태

기본 문법

  • 쉘 스크립트는 파일로 작성 후, 파일 실행
  • 파일의 가장 위의 첫 라인은 #!/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

댓글