Computer Science/Linux

[Shell Script] Bash Shell Script

HJChung 2021. 8. 8. 09:22

최근에 shell script를 접할 기회가 많았다. 

Shell script를 접하면서 든 생각은
1. 어떤 언어이고, 왜 쓰지??

2. 코드를 이해하고 싶다..

3. shell script를 작성해야 하는데 어떡하지?

 

지금이 공부해야 할 시간이라고 생각했고 <시스템 엔지니어가 알려주는 리눅스 기초편 Bash Shell Script> 도 참고해서 3일 정도? 빠르게 훑어보았다. 

 

1. Kernel? Shell? Shell Script? Terminal?

[운영체제] 운영체제 구조 - 시스템콜, 사용자 모드, 커널 모드 여기에도 정리해 둔 적이 있는데, 

이 개념들을 다시 확실히 정리하고 시작하고 싶다. 

여기서 응용 프로그램, 운영체제, 컴퓨터 하드웨어(시스템 리소스)를 도서관에 비유해보면

 

운영체제 - 도서관

응용 프로그램 - 시민

컴퓨터 하드웨어 - 책

 

- 그래서 응용 프로그램(시민)이 운영체제(도서관)에서 컴퓨터 하드웨어(자원; 책)을 요청하면

- 운영체제(도서관)은 적절한 컴퓨터 하드웨어(책)을 찾아서 응용 프로그램(시민)에게 빌려줌(즉, 하드웨어를 잠깐 쓸 수 있게 해준 뒤)

- 응용 프로그램(시민)이 사용할 기간이 다 되면, 운영체제(도서관)이 해당 컴퓨터 하드웨어(책)을 회수한다.

 

이렇듯 응용 프로그램, 운영체제, 컴퓨터 하드웨어(시스템 리소스)의 관계를 다시 설명하면, 

 

- 운영체제는 응용 프로그램이 요청하는 메모리를 허가하고, 분배한다. 

- 운영체제는 응용 프로그램이 요청하는 CPU 시간을 제공한다. 

- 운영체제는 응용 프로그램이 요청하는 I/O Devices의 사용을 허가/제안한다. 

 

커널은 컴퓨터의 물리적(=하드웨어) 자원과 추상화 자원을 관리하면서 물리적으로 하나 뿐인 하드웨어를 여러 사용자들이 번갈아 사용하게 중재, 관리하기 위한

- File management

- Process management

- I/O management

- Memory management

- Device management 등의 역할을 한다. 

그런데 커널은 컴퓨터 자원들만 바라보고 있고, 유저와의 상호작용을 지원하지 않는다.

그래서 OS는 사용자 인터페이스(위 그림에서 Shell - User Interface 라고 되어 있는 것)를 제공하는데, 이를 통해서 사용자가 OS의 기능과 서비스를 조작 할 수 있다. 

 

 

유저와 커널간 인터페이스 역할을 하는 프로그램이라는 shell이 있다. 

즉 유저가 직접 커널에 접근해서 제어하는건 위험한 일이고 그럴 수 없기 때문에 사람이 이해하기 쉬운 형태의 명령어를 입력하면 shell에 해당하는 프로그램들이 해석해서 커널에게 전달해주는 것이다!

 

 

shell에는 Command Line Sell이랑 Graphical shell이 있는데,
커맨드 라인에서 명령을 입력하는 방식의 인터페이스를 통해 Command Line Shell을 실행하는 것이 프로세스간 입출력 전달이나 자동화에 최적화되어 있다. 

나 역시 이런 기능을 사용하려고 shell 명령어를 배운것이기도 하고, 이를 수행할 수 있는 곳이 terminal이다. 

 

이제 전체적이니 그림을 보면, 

1. 사용자는 터미널에서 명령어를 입력하여 shell을 실행한다.
2. 그러면 shell은 사용자로부터 받은 명령어를 해석하여 명령, 옵션, 인자값이 정확한지 확인 한 후 커널에 처리를 요청한다. 

3. 커널은 하드웨어 자원을 적절히 사용해서 이를 처리한 후 

결과를 반환한다.

2. 리눅스 명령어(Shell commands)

shell에는 여러가지 프로그램이 있는데, 

리눅스 명령어가 결국 shell이 제공하는 명령어이고, 

리눅스 기본 shell이 bash이므로, bash에서 제공하는 기본 명령어를 배웠다. 

※ macOS 버전 10.15 인 ‘카탈리나’ 부터 기본 쉘 (Shell) 이 bash1 에서 zsh (Z shell)2 로 변경 되었습니다.

shell의 종류에는 여러가지가 있는데, 기본적으로 bash shell이 터미널을 통해서 실행된다.

 

 

이 명령어든은 한 번 본다고 다 외울 수도 없고 기억도 잘 안나기 때문에 그냥 '아 이런 명령어가 있구나~' 정도로 기억하고 나중에 필요 할 때 검색해서 쓰면 될 것 같다!

1) 파일 시스템 관련 명렁어

  • cd(Change Directory): 현재 작업 디렉토리를 지정한 디렉토리로 변경
    • 방금 전에 왔던 경로로 다시 되돌아가려면 cd -
  • ls(List): 현 디렉토리의 파일 목록을 출력
    • ls -1: 파일명만 세로로 출력해서 보여줌
    • -l : 각 파일의 모드, 링크 수 , 소유자, 그룹, 크기, 최종 수정 시간을 표시
    • ls -alh: h는 사람이 읽기 편한 용량을 표시 해 줌
    • ls -a : .이 붙어있는 파일(숨김파일)을 포함하여 디렉토리의 모든 항목 표시
    • ls -alt : 시간 순 정렬
    • ls -altr: 역 시간 순 정렬
  • df(Disk Free): 마운트된 모든 장치에 대한 현재의 디스크 공간 통계를 출력
    • df -h 로 많이 사용
    • df -i : Inode 표시
  • mkdir (Make Directory): 디렉토리를 생성
  • rmdir (Remove Directory): 디렉토리를 삭제
    • 단 해당 디렉토리에 파일이 있으면 삭제가 안 됨 rmdir: failed to remove '[디렉토리명]': Directory not empty 라는 에러가 뜸
  • pwd (Print working Directory): 현재 위치한 디렉토리의 절대 경로를 출력

2) 디렉토리 관련

  • mount: 디스크 장치를 표시하거나 가상 파일 시스템으로 지정한 디렉토리를 연결(마운트)
    • ex. cent2 서버에 어떤 프로그램을 설치를 하고, cent1 서버에서 cent2 서버의 디렉토리를 로컬 디렉토리처럼 사용가능하게 해줌
    • /nfs를 /mnt 디렉토리에 mount해준다고 하자.
    • -t 는 파일시스템 타입을 의미, [ip주소]:/nfs 는 mount 할 서버의 ip와 디렉토리,
  • stat: 지정한 파일의 파일 통계를 출력

3) 파일 관련

  • touch: 지정한 이름의 비어있는 파일을 생성하거나 파일이 있는 경우 타임스템프를 업데이트
    • 지정한 이름의 빈 파일을 생성하는데 많이 쓰임
  • cat (catenate): 지정한 파일의 내용을 출력
  • head: 지정한 파일의 1라인부터 지정한 라인까지 출력(기본 지정값은 10)
    • head [파일 명]
    • head -n [보고싶은 라인 수] [파일 명]
  • tail: 지정한 파일의 마지막 라인부터 지정한 수 만큼의 라인을 출력(기본 지정값은 10)
    • tail testfile.txt
    • tail -f [로그파일]: 로그파일이 갱신 되는게 실시간으로 보이는 것
    • nginx 서버의 로그
  • cp (Copy): 지정한 파일을 지정한 위치와 이름으로 복사
    • cp -rfp [원본 파일 디렉토리/파일명] [복사할 파일 디렉토리/파일명]
    • r: recursive 하위 파일까지 다 복사
    • f: force 같은 파일이 있더라도 그대로 덮어씀
    • p: permission 권한도 그대로 복사
  • mv(move): 지정한 파일을 지정한 위치와 이름으로 이동
  • rename: 지정한 규칙에 따라 여러 개의 파일 이름을 변경
    • rename [변경 전 파일명] [변경 후 파일명] [대상 파일]
  • rm (remove): 지정한 파일을 삭제
  • less: 상하로 커서 이동이 가능한 파일 보기
  • ln(Link): 지정한 파일에 대한 심볼릭 링크나 하드 링크를 생성
  • paste: 지정한 파일들의 행을 읽어 탭으로 구분하여 병합
    • paste는 shell script에서 많이 사용됨
    • cat과 구분해서 보면 차이가 명확!
  • dd(Dataset Definition): 블록 단위로 데이터셋을 정의하여 파일을 쓰고 읽음.
    • 사용방법이 굉장히 다양
    • 실무에서는 랜덤 데이터로 파일을 생성하고, 생성시 시간을 측정해서 드라이브 성능을 측정하는데 많이 사용됨
    • dd if=[인풋 파일명] of=[아웃풋 파일명] bs=[바이트(크기)] count=[블럭을 복사할 횟수]
  • tar(Tape Archive): 지정한 데이터 및 디렉토리를 하나의 파일로 묶고, 압축 or 압축을 풀때 사용
    • c: create 묶어서 새로운 파일을 만들겠다.
    • v: 명령을 실행하는 진행 과정을 화면에 보여줌
    • z: gzip으로 압축한다 (j는 bzip으로 압축)
    • f: 파일 이름을 명시적으로 지정해준다.
    • 압축을 할 때: tar -cvzf [타르볼파일명] [디렉토리명/파일명]
    • 압축을 할 때: tar -xvzf [타르볼파일명]

3) 프로세스 관련

프로그램을 실행하면 실행할 내용을 메모리에 올려두고 cpu가 메모리에서 실행할 내용을 읽어다가 실행한다. 여기서 메모리에 올라가 있는 작업 단위를 프로세스라고 한다.

이를 명령어로 확인해보자.

  • ps (Process Status): 시스템에서 실행 중인 프로세스에 대한 정보를 출력
    • -ef
    • aux: cpu, memory에 대한 정보도 확인 가능
  • pstree(Process Status TREE): 시스템에서 실행 중인 프로셋스에 대한 정보를 트리구조로 출력하는 툴
  • top: 프로세스 목록을 일정 시간마다 새로고침하여 화면에 출력하는 툴로, 시스템 전반적인 상황을 모니터링 할 수 있음
    • k를 누르면 kill 명령어를 사용할 수 있음
  • nohub(NO HangUPs): 쉘 스크립트 파일을 데몬 형태로 실행하며 표준 출력을 지정한 파일로 리다이렉트
    • 프로그램이 할 일을 다 마칠때까지 백그라운드에서 명령어를 실행하게 하는 명령어
    • ex. nohub echo "Bash Command"
  • kill: 지정한 프로세스에 지정한 시그널을 보내 프로세스 종료하도록 부탁하는 명령어
    • kill -INT [프로세스 변호] ( = kill -2 [프로세스 번호])
    • kill -TERM [프로세스 번호] ( = kill -15 [프로세스 번호])
    • kill -KILL [프로세스 번호] ( = kill -9 [프로세스 번호])

4) 네트워크 관련

  • ifconfig (Interface Configration): 네트워크 인터페이스의 활성/비활성 및 설정
  • ip: ip 관련 정보 조회 및 설정
    • ip address show [볼 것]
  • netstat(Network Statistics): 네트워크 프로토콜의 통계와 연결상태를 출력
    • tcp와 udp 정보 출력
    • -nltpu에서 u가 udp를 말하는 것이므로 u를 빼면 tcp 정보만 출력해줌
      • -n: 정해진 이름, 도메인 이름 등을 빼고 ip, port 번호를 숫자로 보여주는 옵션
      • -l: listen하고 있는 상태의 소켓을 보여줌
      • -t: tcp 통신
      • -p: 프로그램의 이름
      • -u: udp 통신
  • ss(Socket Statistics): 네트워크 소켓의 통계와 연결상태를 출력
  • iptables: 패킷이 어느 ip로부터 출발해서 어느 ip로 찾아가느냐 필터링 도구로 패킷의 출입을 제한하는 방화벽 구성이나 NAT구성에 사용
    • iptables -nL
    • -n: 정해진 이름, 도메인 이름 등을 빼고 ip, port 번호를 숫자로 보여주는 옵션
    • -L: list의 약자
    • 방화벽의 기본 정책: 들어오는 통신은 다 막아두고 꼭 필요한 포트만 열거나 꼭 필요한 ip나 포트만 열어두고 사용
    • systemctl status iptables
    • systemctl start iptables
  • ufw: iptables의 제어를 쉽게 하기 위한 도구
  • ping: ICMP 프로토콜(서버와 서버 사이에 통신이 되는지 확인)의 응답 확인 도구
    • cent1서버와 cent2 서버가 통신 되는지 cent1에서 ping cent2
    • -c: ping을 몇 번을 보낼지ㅣ 지정할 수 있기 떼문에 실무ㅜ에서 가장 중요한 옵션
      • ping -c [보낼 횟수] [서버]
    • wget(World wide web + GET): 웹서버로부터 컨텐츠를 가져오는 도구
      • wget [url]
      • 실무에서는 소스를 받아서 컴파일 설치를 하려고 할 때 많이 사용
  • curl (Client for URLs): 다양한 프로토콜을 사용하여 데이터를 전송하게 해 주는 도구
    • -L: redirect
    • -w: output
  • route: 네트워크의 경로 정보는 route table에 저장되어 있는데, 네트워크의 경로 정보의 출력, 변경하는 도구

5) 검색/탐색 관련

  • find: 지정한 파일명 또는 정규표현식을 이용하여 파일을 검색. 원하는 파일을 찾으려면 매번 cd, ls 해봐야 할까? 그래서 만들어진 명령어 find
    • find [옵션] [찾기 시작할 디렉토리] [익스프레션]
    • ex. find -name ./ testfile.txt
    • ex. find -name ./ testfile.t?t (정규표현식 사용)
  • which: 환경변수 PATH에 등록된 디렉토리에 있는 명령어를 찾아주는 도구
  • grep(Global, Regular Expression, Print): 텍스트 검색 기능을 가진 도구, 파일이나 표준 입력을 검색하여 지정한 정규 표현식과 맞는 줄을 출력
    • 실무에서 정말 많이 쓰는 명령어
    • grep [옵션] [찾을 문자열] [파일명 ]
    • ex. 로그 디렉토리에서 error 라는 문장이 포함된 내용을 찾고 싶다면? grep "error" /var/log/*
    • -i: 리눅스는 대소문자를 구분한다. i 옵션을 사용하면 대소문자 구분하지 않고 다 잡힌다.
      • ex. error, Error, ERROR.. 등이 있을 때
      • grep -i "error" [파일명] 하면 모든 에러가 다 잡힘
    • -r: 하위 파일까지 모두 찾아줌
      • history: 명령어를 수행한 목록을 출력/조작

6) I/O 관련

  • redirection: 표준 스트림(stdin, stdout, stderr)을 부등호를 사용하여 지정한 위치로 보낼 수 있는 방향지정 옵션
    • >: 파일을 초기화하면서   
    • >>: 기존내용에 추가
  • echo: 문자열을 출력하는 도구

7) User 관련

  • chmod(Change mode): 파일이나 디렉토리의 ㅣ모드(접근권한)을 변경하는 도구
    • chmod [권한 정보] [권한 정보를 줄 파일명]
      • 권한정보:
        • 소유자, 그룹, 그 밖의 유저
        • rwx rwx rwx
        • 421 421 421
      • ex. rw_ rw_ r--
        • 4+2. 4+2. 4
        • 6. 6. 4
  • chown(Change the owner of a file): 파일의 소유권을 바꾸기 위한 도구
    • chown [소유자명]:[그룹명] [파일/디렉토리명]
  • sudo(Superuser Do -> substitude user do): root 사용자의 보안 권한을 이용하여 명령 또는 프로그램을 실행하는 도구
  • who: 현재 시스템에 로그인한 사용자 목록을 출력

 

하 힘들었다. ..

 

3. Shell Script

shell script는 shell에서 원하는 결과를 얻기 위한 shell 명령어들의 집합을 파일로 만들어 놓은 것

shell script 적기 전 키보드에 손 올리기 전에! 다음과 같은 과정을 해보는게 어떨까

  1. 어떤 결과를 얻을 것인가
  2. 순서 결정
  3. 순서에 맞는 명령어와 옵션 결정
  4. 파일 만들고 명령어를 순서대로 적어준다.

 

1) 명령을 연속으로 실행하는 방법

1. 파이프라인( | ): 파이프라인 왼쪽의 명령절과 표준스트림을 오른쪽 명령의 입력으로 사용

ex)

  1. 어떤 결과를 얻을 것인가
    • 파이프라인을 이용해 testfile.txt의 안에 777이라는 문자열이 존재하는지 확인
  2. 순서 결정
    • testfile.txt를 읽는다.
    • 읽은 내용에서 777이 있는지 확인을 한다.
  3. 순서에 맞는 명령어와 옵션 결정
    • cat testfile.txt
    • a의 결과를 파이프라인 왼쪽의 코드의 입력으로 넘겨서 grep 777
  4. 파일 만들고 명령어를 순서대로 적어둔다.
    • cat testfile.txt | grep 777

2. 세미콜론(; ): 세미콜론 왼쪽의 명령이 끝난 후 결과와 상관 없이 이어서 독립적으로 세미콜론 오른쪽의 명령을 실행

ex)

      1. 어떤 결과를 얻을 것인가
        • cent1 서버에서 cent3 서버의 로그 디렉토리 파일 리스트와 디스크 통계를 보고 싶다.
      2. 순서결정
        • cent1서버에서 cent3서버로 접속
        • 로그 디렉토리의 파일 리스트를 본다.
        • 디스크 통계를 본다.
      3. 순서에 맞는 명령어와 옵션 결정
        • ssh cent3
        • ls -al /var/log
        • df -h
      4. 파일을 만들고 명령어를 순서대로 적어둔다.
        • ssh cent3 "ls -al /var/log ; df -h"
          • 왜냐하면 디스크 통계를 보는건 앞선 로그 디렉토리의 파일 리스트를 보는 것과 독립적인 것이기 때문에 ;을 사용한다.

2) 특정 조건에 따라 명령어를 실행하거나 실행하지 않는 방법

1. AND 조건(&&)

처음에는 '좌측 명령/테스트의 결과가 참일 때 우측의 명령을 실행'이라고 이해했는데, 
그게 아니라 왼 -> 오른 쪽 으로 실행하니까 왼쪽에서 false가 나면 어짜피 뒤의 조건을 실행, 검사하더라도 조건을 만족하지 않기 때문에 뒤의 명령을 실행하지 않는 것이라고 이해하는게 맞는 것 같다. 

 

앞에서부터 순차적으로 실행하되, 명령 실행에 실패할 경우 뒤에 오는 명령은 실행하지 않는다.라고 설명하는 것이 더 정확한 설명이다.

 

2. OR 조건( || )

좌측 명령/테스트의 결과가 거짓일 때 우측의 명령을 실행

앞에서부터 순차적으로 실행하되, 명령 실행에 성공하면 뒤에 오는 명령을 실행하지 않는다.

3) 조건문

if [조건문1]; then
  실행할 명령어
elif [조건문2]; then
  실행할 명령어
else
  실행할 명령어
fi

ex )

#!/bin/bash

LOAD = $(로드 에버리지 숫자를 가져오는 명령)
if ["${LOAD}" -ge 5]; then
  슬랙/테레그램/메일로 경고메세지를 날리는 명령
else
  echo "No problem"
fi

※ 조건이 여러개라면?

and는 -a 옵션을 사용한다.

[조건1 -a 조건2 -a 조건3]

or은 -o를 쓴다.

4) 조건문 case

case 변수 in
  패턴1)
    패턴1이 참일 경우 실행할 명령어;; # NOTE: 세미콜론이 2개인 이유: case문을 빠져나간다는 의미
  패턴2)
    패턴2가 참일 경우 실행할 명령어;;
  # 패턴이 더 필요한 경우 추가
  *)
    위에서 지정한 모든 패턴에 해당이 안되는 경우 실행할 명령어;;
esac  
  # esac로 case문이 끝났다는 걸 나타낸다.

ex)

#!/bin/bash

## ./nginx_ctl.sh start     : nginx start
## ./nginx_ctl.sh stop      : nginx stop
## ./nginx_ctl.sh reload    : nginx reload
## ./nginx_ctl.sh configtest: ningx.conf의 문법을 확인
### ./nginx_ct.sh a b c 라고 쳤으면 
### $1은 a, $2는 b, $3은 c로 인식한다. 

# 그래서
# 위의 명령어에 관련된 case문을 작성한다고 치면, 
CMD=$1

case "${CMD}" in
start)
  NGINX를 시작하는 명령;;
stop)
  NGINX를 멈추는 명령;;
reload)
  NGINX를 리로드하는 명령;;
configtest)
  NGINX의 설정파일을 확인하는 명령;;
*)
  echo "사용방법: ./nginx_ctl.sh {start|stop|reload|configtest}";;
esac

5) 반복문

for 반복문

for 변수 in 변수에 넣을 데이터
do
  데이터가 끝날 때까지 반복해서 실행할 명령어
done

while 반복문

while 조건문
do
  조건이 참인 동안 반복해서 실행할 명령어
done

 

ex) 

#!/bin/bash

for NUM in $(seq 1 3)
do
  echo "[cent${NUM}]에 접속합니다.."
  ssh ${SVR} "uptime"
  echo
done

 

6) function

function 함수명 {
  명령어
}

ex)

calc.sh

#!/bin/bash

function plus {
  echo "$1 + $2 = "
  echo $[ $1 + $2 ]
  echo
}

function minus {
  echo "$1 - $2 = "
  echo $[ $1 - $2 ]
  echo
}

function multi {
  echo "$1 * $2 = "
  echo $[ $1 * $2 ]
  echo
}

use_calc.sh

#!/bin/bash

source ./calc # source를 써서, 현재 위치에 있는 calc코드를 불러오겠다. 라고 선언 

plus 30 40
minus 10 3
multi 11 7

7) Redirect

입력/출력/에러(표준 스트림)을 지정한 곳으로 바꿔준다.

쉘 스크립트 안에서 텍스트 파일의 활용

실행결과나 진행 상황을 파일로 남기게 되면 이게 바로 로그파일이 된다.

  • 1: 표준 출력 (표준 출력(정상적인 메시지)을 ok라는 파일에 써보자.)
    • 1> ok
  • 2: 표준 에러 (표준 에러 메세지를 ng라는 파일에 써보자.)
    • 2> ng
      
      # 보통 2>/dev/null 이렇게 많이 사용합니다.

ex)

# 위의 결과를 이메일로 보냄
# 위의 결과를 파일로 저장한 뒤
# 파일의 내용을 이메일의 본문으로 보내면 됨

touch reposr #파일 생성
cp -f /dev/null report #파일 초기화

{df -h
pstree
free -m
uptime
} >> report

# 이렇게 한 번에 작성 해주 수 있음. 

# 위 결과를 이메일로 보냄
# 이메일 보내는 커맨드: cat report | mail -s "제목" 이메일
cat report | mail -s "[report] curr server system info" hjgy0511@gmail.com

※ #!/bin/bash의 의미? => 이 글에 아주 간단하고 명확하게 잘 설명 되어있었다. 

 

4. 활용 사례

1) 백업하기

어떤 디렉토리에 하부 디렉토리나 파일이 생성 될 때가 많고, 이게 중요한 파일이라면 주기적으로 백업을 해주는게 좋다.

이 때 압축해서 백업 할 때 사용되는 shell script이다.

#!/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 $D/$STDIR/$BACKUPFILE $SRCDIR
    else
    	mkdir $DSTDIR
        tar -cvzf $D/$STDIR/$BACKUPFILE $SRCDIR
    fi
fi

설명하면,

-z 옵션: 문자열의 길이가 0인가

2개의 인자를 받는데, 만약 2개의 인자가 들어오지 않는다면 

    Shell 이름($0)과 함께 사용법을 화면에 출력해주고 끝낸다. 

인자를 잘 받았다면, 

    첫 번째 인자인 백업 할 대상 경로를 변수에 담아두고, 

    두 번재 인자인 백업 결과 경로를 변수에 담아둔다. 

    그리고 파일명은 이런식으로 만들어 줄 텐데 현재 서버의 날짜와 시간을 확인하거나 설정할 수 있는 date라는 shell 명령어에 format이렇게 쓰면 현재시간이 이런 포멧으로 담긴다. 

    그리고 -d 옵션: 파일이 존재하고 디렉토리인가 를 확인하고 

    있으면

         gzip으로 묶고 압축

    없으면 

         디렉토리를 생성하고 gzip으로 묶고 압축

 

2) 로그 파일 정리하기

  1. 현재 시점에서 2일 지난 로그 파일들은 압축을 해서 보관하자 
  2. 이미 압축된 로그 파일 중에 3일 이상이 경과한 것들은 삭제하자 .
#!/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 {}" \; 2> /dev/null
sudo find . -type f -name '*.gz?' -mtime +$DELDAY -exec bash -c "rm -f {}" \; 2> /dev/null

로그 파일이 모여있는 LOGDIR로 가서, 

화면에 이동했다는 것을 출력하고, 아래의 명령어를 실행한다. 

sudo로 시작하는 이유는 /var/log가 sudo 권한이 있어야 하는 경우가 많기 때문이다.

3) Github Actions 에서 Bash Shell Script 실행시키기

CICD에 많이 사용하는 github actions. 이 동작은 리눅스 가상머신에서 돌아가기 때문에 run: 아래에 바로 shell script를 작성 할 수 있다. 이때 shell: 에 shell 종류도 지정할 수 있고 bash로 선택하면 된다. 

- name: practice shell script on actions
  shell: bash
  run:
    echo "hello world!"
    whoami
    pwd -P

4) 개발 환경을 쉘 스크립트로 ㅎㅎ

우아한 형제들 기술 블로그에서 본 건데.. 개발환경 통일과 손쉬운 설치를 위해 개발 환경을 쉘 스크립트로 작성할 수도 있겠다고 배웠다 ~!

 

출처: https://techblog.woowahan.com/2541/

 

 

 

 

지금까지 bash shelll script에 대해서 공부 한 것을 정리해 보았다. 

고급 명령어도 더 배우면 좋을 것 같고 앞서 가졌던 

Shell script를 접하면서 든 생각은
1. 어떤 언어이고, 왜 쓰지??

2. 코드를 이해하고 싶다..

3. shell script를 작성해야 하는데 어떡하지?

 

이 정도의 궁금증이 어느정도는 해소 된 것 같아서 뿌듯하다~!

 

 

reference

시스템 엔지니어가 알려주는 리눅스 기초편 Bash Shell Script

커맨드라인 인터페이스, 셸, 터미널이란?

What is Terminal, Console, Shell and Kernel?

개발환경을 한 방에! 쉘 스크립트의 힘

깃헙 액션 + 쉘 스크립트로 알고리즘 풀이 알림봇 만들기

#!/bin/bash 란?