Shell Script에 대한 설명 및 사용 방법

Shell Script

Shell

OS와 대화하는 프로그램으로, 여러 종류가 있으며 그 예시로 ‘bash, zsh’가 있다.

1. Shell Script?

Shell의 종류는 Bourne Shell, Bash, ksh, zsh가 있다.
Bash는 Bourne-Agin Shell의 약자로 명령형 편집 기능을 제공하며 리눅스에서 가장 많이 사용된다.
zsh는 z셸 스크립을 위한 명령 인터프리터이다.
Shell Script(sh file)를 사용하게 되며, 이는 txt 형식으로 저장되는 프로그램으로, shell이 실행할 수 있는 명령들의 집합이라고 볼 수 있다.
자동화 작업들을 shell script로 만들어 편리한 사용이 가능하다.

2. Shell Script 파일 생성, 작성, 실행

#!/bin/bash
echo "HIHIHI!"
pwd
ls

위와 같이 작성을 한 뒤, 실행하면 아래의 사진과 같은 결과가 나온다.
입력값 불러오기(echo), 현재 위치 경로 출력(pwd), 현재 위치 디렉토리 파일 출력(ls)의 순서대로 나온 것을 볼 수 있다.

drawing

3. Shell Script내 간단한 문법들

3-1. 반복문 - for

기본적으로 사용하는 반복문으로 for가 있다. for in - do - done의 형태로 이루어지며, 코드로 보면 다음과 같다.

for file in $files
do
	filename=`basename $file`
done

변수로 지정해준 $files내의 각 요소들을 변수명 file로 지정해주었고, do - done 사이에 이와 관련된 내용들을 작성해주면 된다.

3-2. 파일, 디렉토리 찾기 - find

find . -name "DAY*"

find . -name "DAY*" -type d
find . -name "DAY*" -type f

‘.’은 현재 디렉토리 내의 모든 파일, -name은 이름으로 찾는 것, “DAY*”는 DAY라는 형식으로 이루어진 모든 파일임을 말한다.
-type d는 디렉토리로, -type f는 파일로 찾는다는 것을 말한다.

find . -empty

-empty를 이용해 빈 파일을 찾는 데에 사용할 수 있다.

find . -size +100M

-size를 이용해 특정 크기 이상, 이하의 파일을 찾는 데에 사용할 수 있다.

find . -name "DAY*" -exec ls -l {} \;

-exec를 이용해 부가적인 작업의 수행이 가능하다.
검색된 파일이 {} 위치에 들어오게 되고, 추가적인 작업을 이어나가면 된다.

3-3. 디렉토리 생성 ∙ 삭제

mkdir ABC
rm -rf ABC

mkdir를 이용해 뒤에 나오는 단어의 이름으로 디렉토리를 생성할 수 있다.
rm을 이용해 파일 및 디렉토리의 삭제가 가능하다. 단, 디렉토리의 삭제를 위해서는 -r이라는 옵션이 들어가야하고, -f라는 옵션을 함께 사용하면, 경고 없이 모두 강제로 삭제된다.

3-4. 경로에서 파일명 가져오기

dirname=`basename $dir`

basename을 이용하면 특정 경로를 나타내는 값들의 마지막 부분,
예를 들면, home/ABC/backup/test.txt와 같은 상황에서 test.txt만 나오도록 할 수 있다.
위 코드의 경우, ` dirname=```의 형태를 갖고 있는데, 이렇게 할 경우, dirname이라는 변수가 만들어지고, $dirname로 활용할 수 있다.

3-5. 문자열 일부 가져오기

dirnum=${dirname:3}

# dirname : "HELLO WORLD"
# dirnum : LO WORLD

dirname의 값으로 나오는 문자열 중, 네 번째(3+1)의 값부터 문자열을 잘라 표현해준다. 즉, 뒤에 나오는 숫자에 맞는 순서의 문자부터 그 뒤의 값들을 보여준다.

3-6. 조건문 사용하기 - if

if [ -f $filename ]
then
  ...
else
	...
fi

if 의 내부에 값이 true일 경우, then의 다음에 오는 과정들을 처리하고, 아닐경우 else의 뒤에 오는 과정들을 처리한다. 이 과정을 fi가 나올 때까지 진행한다.
조건문의 여러 상황에 대해 정리된 자료 링크가 있어 아래에 추가적으로 적는다.

# if 여러 상황에 대해서
[ -z ${A} ] : A 문자열의 길이가 0이면 TRUE
[ -n ${A} ] : A 문자열의 길이가 0이 아니면 TRUE
[ ${A} -eq ${B} ] : A와 B값이 같으면 TRUE
[ ${A} -ne ${B} ] : A와 B값이 다르면 TRUE
[ ${A} -gt ${B} ] : A가 B보다 크면 TRUE
[ ${A} -ge ${B} ] : A가 B보다 크거나 같으면 TRUE
[ ${A} -lt ${B} ] : A가 B보다 작으면 TRUE
[ ${A} -le ${B} ] : A가 B보다 작거나 같으면 TRUE

[ 조건식A -a 조건식B ] : 조건식 A와 B가 모두 TRUE이면 TRUE (&& 와 동일)
[ 조건식A -o 조건식B ] : 조건식 A가 TRUE거나 조건식B가 TRUE면 TRUE (|| 와 동일)

파일관련
[ -d ${A} ] : A 파일이 디렉토리면 TRUE
[ -e ${A} ] : A 파일이(노드, 디렉토리, 소켓 등등 모두) 존재하면 TRUE
[ -L ${A} ] : A 파일이 심볼릭 링크면 TRUE
[ -r ${A} ] : A 파일이 읽기 가능하면 TRUE
[ -s ${A} ] : A 파일의 크기가 0 보다 크면 TRUE
[ -w ${A} ] : A 파일이 쓰기 가능하면 TRUE
[ -x ${A} ] : A 파일이 실행 가능하면 TRUE
[ -c ${A} ] : A 파일이 Special character file 이면 TRUE
[ -f ${A} ] : A 파일이 디렉토리가 아닌 일반 regular 파일이면 TRUE
[ -S ${A} ] : A 파일이 소켓이면 TRUE
[ ${A} -nt ${B} ] : A 파일 B 파일보다 최신파일이면 참
[ ${A} -ot ${B} ]  : A 파일이 B 파일보다 이전파일이면 참
[ ${A} -ef ${B} ] : A 파일과 B 파일이 같은 파일이면 참

3-7. 결과값 표시 - echo

echo text or 변수명

적혀진 텍스트, 혹은 변수의 값을 표현해준다.
JavaScript의 console.log와 같은 역할을 한다고 볼 수 있어, Shell Script 사용 시 사용자에게 보여주어야 할 메세지가 있을 때에도 사용할 수 있다.

3-8. 시간 구하기 - date

date

day=`date +%Y%m%d`

date라고 작성할 시 2022년 1월 10일 월요일 01시 51분 38초 KST 와 같이 결과값이 나오게 된다.
위의 코드같은 경우, 결과 값으로 20220110가 나오게 되며, 이를 활용해 다양한 날짜의 표현이 가능하다. 세세한 여러 표현 방법을 알려주는 링크를 참고하면 좋을 듯 하다.

3-9. 파일 압축하기 - zip

zip BACKUP_$day.zip ./BEFORE_ZIP

zip AAA.zip -r ./*

zip “파일이름” “압축할 디렉토리” 의 순서로 작성하면 된다.
두 번째와 같이 -r을 작성하면 현재폴더의 모든 것 및 하위 폴더들도 모두 압축하게 된다.

3-10. 다른 서버로의 파일 전송 - scp

# 로컬에서 원격
scp [전송할 파일 경로] [유저명]@[IP주소]:[받을 경로]

# 원격에서 로컬
scp [유저명]@[IP주소]:[전송할 파일 경로] [받을 경로]

# 원격에서 원격
scp [유저명]@[IP주소]:[전송할 파일 경로] [유저명]@[IP주소]:[받을 경로]

scp ./BACKUP_$day.zip $ubuntuserver:backup와 같이 작성하면, 내 서버내의 특정 파일을 다른 원격으로 보내는 경우로, 첫 번째 예시의 사례와 같다.


링크