본문 바로가기
데이터 관련/Linux(Ubuntu)

[Linux 커맨드라인 입문] Shell Script

by 준쓰_ 2023. 1. 28.

해당 글의 내용은 모두의연구소에서 진행한
" 처음부터 시작하는 우분투 "풀잎스쿨 자료를 바탕으로 했습니다.

선요약

  • Shell Script에 대한 정리
    • Shell이란?
    • Shell Script 작성팁
    • Shell Script 예시

내용

1) Shell Script란?

  • 리눅스 명령어로 이루어진 스크립트
  • 리눅스 명령어를 차례대로 실행
  • 리눅스 명령어를 조합하여 작업을 자동화하는 용도로 사용

2) shell script 작성 시 팁

  • 셸 스크립트 정의
    • Shell Script 파일 작성 시 상단에 #!/bin/sh 라고 적어주어 sh 파일임을 명시
  • 셸 스크립트 파일 작성 시 작성법
    • vim으로 test 라는 셸 스크립트 파일을 만들 때
      • ex) vim test.sh
  • 셸 스크립트 실행 명령어
    • sh [파일명]
  • 변수 선언
    • ex) x = $10
# 셸 스크립트 내 변수 선언
#!/bin/sh
x = $1
y = $2
Z = $3

# 변수 출력 시 사용하는 명령어
echo $x $y $z
# 출력 값 1, 2, 3
  • 변수 접근 및 출력
    • 변수명 앞에 $ 를 붙여야 함
    • echo $x
  • 외부에서 인자 넣기
    • ex) test 라는 파일명을 가진 셸스크립트 파일이 있다고 가정
    #!/bin/bash
    echo "1st param = $1"
    echo "2nd param = $2"
    echo "3rd param = $3"
    
    echo "The number of params = $#"
    • sh test.sh 111 222 333 입력
    # 결과물
    1st param = 111
    2nd param = 222
    3rd param = 333
    The number of params = 3
  • 셸 스크립트 내 비교연산자 인자 (while loop 작성법 내 예시 참고)
    • eq - equal ( = )
    • ne - not equal ( <> )
    • lt - little ( < )
    • le - little or equal ( <= )
    • gt - greater ( > )
    • ge - greater or equal ( >= )
  • 사칙연산 계산을 위한 expr 사용
    • shell script 내에서 계산을 하기 위해 사용
      • 산술 : +, -, *, /, %
      • 논리 : |(or), &(and)
      • 관계 : =, >, >=, <, <=, !=
      • 문자열 : ':'(일치 혹은 substitute)
    • expr도 명령어이기 때문에 연산자와 피연산자는 (space)로 구분
    • 공백을 안주면 5+1을 하나의 문자열로 인식
    • $ expr 5+1 5+1 $ expr 5 + 1 6
    • expr에 사용되는 인수들을 통째로 따옴표처리하면,
      $ expr '5 * 3'
      5 * 3
    • expr에 연산자 / 피연산자의 구분되어 처리되지 않고 하나의 문자열로 취급
    • 참고사이트
  • for loop 작성법
#!/bin/sh
for x in array; do 
    [명령어]
done
  • 예시
#!/bin/sh
days="20221011 20221012 20221013 20221014"
for day in $days; do
    echo $day
done
# 실행 결과물 20221011 \n 20221012 \n 20221013 \n 20221014
  • while loop 작성법
#!/bin/sh
while [ 조건 ] 
do 
    [명령어]
done
  • 예시
#!/bin/sh
x=0
while [ $x -lt 10 ] # lt는 < 의 의미
do
        x=$(expr $x + 1)
        echo $x
done # break 의미
    • if 문 작성법
#!/bin/sh
if [ 조건 ]; then
    [명령어]
else if 
	[명령어]
else
    [명령어]
fi
    • 예시
#!/bin/sh
x=$1
y=$2

if [ $x -lt $y ]; then 
    echo $y is big than $x
else #or  else if 
    echo $x is bigger than $y
fi

# 중요 : [ $x -lt $y ]에서 공백에 신경 써주세요. 붙여서 쓰면 오류가 나옵니다.

3) shell script 예시

  • 예시1 : 네트워크가 불안정한 상황으로, 몇시 쯤에 인터넷이 끊기는 지 확인하고 싶다고 가정
    • ping -c 1 8.8.8.8 | grep received | awk -d',' '{print $6}' 를 입력
      • ping -c 1 8.8.8.8 ⇒ google.com에 한 번 접속하라| awk -d’,’ ‘{print $6}’ ⇒ 출력을 “,”로 나눈 뒤, 6번째 부분을 출력하라
      • | grep received ⇒ 앞의 결과에서 received 가 들어간 열을 저장해라
    • 하지만 사람이 매시 매분마다 이렇게 작성할 수는 없기에 하단 셸 스크립트 파일처럼 작성
  #!/bin/sh   
  test_time=$(date +"%Y-%m-%d %H:%M:%S")   
  loss=$(ping -c 1 8.8.8.8 | grep received | awk -d',' '{print $6}')      
  if [ $loss = 0% ];then       
      echo $test_time connection is  good >> web_connection.log   
  else
      echo $test_time connection is  not good >> web_connection.log   
  fi 
  • 예시2 : 특정 프로세스가 제대로 동작하고 있는 지 확인
    • 50% 확률로 오류를 내는 프로그램(fake_program.py)이 있다고 가정합니다. (별로 중요한 의미는 없습니다.) 해당 프로그램이 현재 실행하고 있는지 확인하는 파일입니다.
      • fake_program.py 내용
from random import randint
from datetime import datetime
import time

# 50% 확률로 0 또는 1
def fake_process():
    if randint(0,1) == 1:
        return True
    else:
        return False

if __name__== '__main__':
    while True:
        time.sleep(10)
        now= datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        if fake_process():
           
            print(f'{now} program works')
       else:

            print(f'{now} program does not work')
  • 해당 프로그램이 현재 실행되는지 확인하는 sh 파일
#!/bin/sh
#~/check_process.sh
program=$(ps aux |grep $1 | grep -v grep | grep -v check_process)
status=$(echo $program |awk '{print $8}')

if [ -z "$program" ]; then
        echo $1 is not work
else
        echo "process status is $status"
fi