쉘 스크립트

tycode·2021년 5월 9일
0

C.S (Computer Science)

목록 보기
19/40
post-custom-banner

쉘 사용 대표적인 예:
서버 작업 자동화 및 운영(DevOps)을 위해

쉘 스크립트 예)

문제
서버가 다움되었다.
확인해보니 서버 저장공간이 하나도 남지 않음
로그 파일(CCTV같이 서버에 어떤 일이 발생했는지 기록) 업데이트가 안되어 관련 프로그램 비정상종료
이유는 로그 파일이 많이 쌓여있음
어떻게 하면 자동으로 오래된 로그 파일을 삭제할까?

해결
간단한 쉘스크립트 생성 및 주기적 실행 (crontab 프로그램)

기본 문법

  • 쉘 스크립트는 파일로 작성 후, 파일을 실행
  • 파일의 가장 위의 첫 라인은 "#!./bin/bash"로 시작
  • 쉘 스크립트 파일은 실행 권한을 가지고 있어야 함 (읽기쓰기실행 rwx rwx rwx)
  • 일반적으로 '파일이름.sh'와 같은 형태로 파일 이름을 작성함

실습

  • bash수레에서 제공하는 echo함수를 이용하여 화면에 "Hello bash!"를 출력 할 수 있도록 스크립트 작성
    • ./test.sh로 실행

주석

# ← 기호로 시작하는 라인은 주석처리
예) # This is comment

변수

  • 선언
    • 변수명=데이터
    • 변수명=데이터 사이에 띄어쓰기는 허용되지 않음
  • 사용
    • $변수명 으로 사용됨

리스트 변수 (배열)

  • 선언
    • 변수명=(데이터1 데이터2 데이터3 ...)
  • 사용
    • ${변수명[인덱스번호]}
      • @이랑 *는 전체 출력
      • #는 @ 또는 *의 사이즈를 출력 (몇개인지)

참고:

$ {}를 안치면 전체가 아닌 분리해서 해석함. 즉, daemons을 읽고 리스트에 가장 첫번째 것만 가져오고 뒤에 스트링을 읽음.

사전에 정의된 지역 변수

연산자

  • expr: 숫자 계산
  • expr를 사용하는 경우 역작은 따옴표 ( ` )를 사용해야 함(작은 따옴표가 아님 - backtick)
  • 연산자 *와 괄호() 앞에는 역슬래시()와 같이 사용
  • 연산자와 숫자, 변수, 기호 사이에는 space를 넣어야함!

조건문 문법

  • 기본 if 구문
    • 명령문ㅇ르 꼭 탭으로 띄워야 하는 것은 아님 (then과 fi 안에만 들어가 잇으면 됨)

실습: 조건문

  • 두 인자값을 받아서 두 인자값이 다르면 'different values'를 출력하라

조건

  • 조건 작성이 다른 프로그래밍 언어와 달리 가독성이 현저히 떨어짐, 필요할 때마다 참조하면 됨!

  • 문자 비교

  • 수치 비교 (< , >는 if 조건시 [[ ]]를 넣는 경우 정상 동작하기도 하지만 '>=' '<='는 안됨, 그래서 기본적으로 다음 문법을 사용하는 것을 권장)

  • 파일 검사

  • 논리 연산 (참고)

조건문 문법

  • 기본 if/else 구문

실습: 조건문

  • 두 인자값을 받아서, 두 인자값이 같으면 'small values'를 출력하고, 그렇지 않으면 'different values'를 출력.

실습: 해석하기

  • 명령 해석
    • ping -c 1192.168.0.11> /dev/null
      (서버에서 여러개의 컴퓨터가 연결되어 있을 때, 그 연결되어 있는 컴퓨터 정상적으로 작동하는지 아닌지 확인하는 프로그램 - 호출하면 응답이 옴)
      • 0: 표준입력, 1: 표준출력, 2: 표준에러
    • 1> /dev/null: 표준 출력 내용은 버려라 (화면에 출력하지 말아라)
    • -c1은 1번만 체크해봐라

참고: 조건문 한줄에 작성하기

  • if 구문 (한 라인에 작성하는 방법)
  • if[뒤와,] 앞에는 반드시 공백이 있어야 함
  • [ ]에서 &&, ||, <, > 연산자들이 에러가 나는 경우는 [[ ]]를 사용하면 정상 작동하는 경우가 있음

반복문 문법

  • 기본 for 구문

실습: 해석하기

  • 현재 디렉토리에 있는 파일과 디렉토리를 출력하라

  • 기본 while 구문

실습: 해석하기

  • 현재 디렉토리에 있는 파일과 디렉토리를 출력하라

참고: 압축 명령 tar

  • 리눅스에서는 여러 파일을 한 파일로 묶은 것을 아카이브(archive)라고 함
    • 파일 확장자는 .tar
  • 리눅스에서 파일 압축은 두 단계로 진행
    i. 아카이브(archive)로 만듬
    ii. gzip프로그램을 사용해서 압축함 + 파일 확장자는 .tar.gz
  • 압축 명령어는 tar를 사용하되, 옵션을 사용해서 gzip기능을 사용함


현업 예제1

  • 백업하기
    • sourcedir 합축할 디렉토리
    • targetdir 압출된 걸 넣을 디렉토리
    • date 쉘 명령어: 매번 파일 이름 다르게 하기 위해 backup.현재시각.tar.gz가 됨

현업 예제2

  • 로그 파일 정리하기

    • 로그파일 2일 이상 - 압축

    • 압축로그파일 3일 이상 - 삭제

    • { } 각각 조건에 맞는 파일들을 (gzip) 압축하라는 뜻.

    • +1: 현재 + 1 = 2일 경과한.

post-custom-banner

0개의 댓글