Shell Script
DEV ·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 파일 생성, 작성, 실행
- 생성 :
vi (filename).sh
을 입력해 파일을 생성할 수 있으며, 이 곳에서 shell script를 작성하게 된다. - 입력 :
i
키를 누르면 입력이 가능한 상태가 되며, 한 줄 씩 작성을 진행하면 된다. - 저장 :
esc
키를 누른 뒤,:wq
키를 입력해 나오면 된다. - 실행 :
sh (filename).sh
를 입력하면 저장된 내용이 실행된다.
#!/bin/bash
echo "HIHIHI!"
pwd
ls
위와 같이 작성을 한 뒤, 실행하면 아래의 사진과 같은 결과가 나온다.
입력값 불러오기(echo
), 현재 위치 경로 출력(pwd
), 현재 위치 디렉토리 파일 출력(ls
)의 순서대로 나온 것을 볼 수 있다.
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와 같이 작성하면, 내 서버내의 특정 파일을 다른 원격으로 보내는 경우로, 첫 번째 예시의 사례와 같다.
링크
- 쉘 스크립트 생성
https://jaynamm.tistory.com/entry/Shell-Script-Shell-Script-생성-및-실행
https://rrecoder.tistory.com/62 - 쉘 스크립트 scp 간단 사용법
https://doheejin.github.io/linux/2021/03/03/linux-scp.html - 터미널 디렉토리, 파일 삭제 방법
https://www.delftstack.com/ko/howto/linux/how-to-delete-files-and-directories-in-linux-terminal/