Linux Shell Script

seong_0629·2023년 8월 23일
1
post-thumbnail

1) Linux Shell Script?
2) Code Intro
3) Code Structure & Result
4) Shell Script Use Case

Linux Shell Script?

  • Linux?
    글에 앞서 Linux는 오픈소스 운영 체제를 의미합니다.
    여기서 말하는 운영 체제(Operating System, OS)는 CPU, 메모리, 스토리지처럼
    시스템의 하드웨어와 리소스를 직접 관리하는 소프트 웨어를 의미합니다.

  • Shell?
    Shell(쉘)은 운영체제상에서 User의 입력명령에 따라
    읽고 해석 후 실행하는 프로그램을 의미합니다.
    본문은 WSL에서 bash Shell을 사용하겠습니다.

Shell 종류
1) bash : Bourne-Again Shell (프롬프트 : #, 경로 : /bin/bash)
2) sh   : Bourne Shell       (프롬프트 : $, 경로 : /bin/sh  )
3) csh  : C Shell            (프롬프트 : %, 경로 : /bin/csh )
4) ksh  : Kron Shell         (프롬프트 : $, 경로 : /bin/ksh )
5) tsch : TENEX C Shell      (프롬프트 : >, 경로 : /bin/tcsh)

Code Intro

  • Why💁‍♂️
    주로 Linux Shell Script는 서버관리에 사용되는 사례를
    많이 보았습니다. 그래서 서버관리에 사용되는 스크립트보다는
    한번 일반적으로 생각나는 걸 Shell Script로 구현해보자는 생각에서 시작하였습니다.

  • What 🤷‍♂️
    우선 제가만든 스크립트는 현재 경로에 있는 전체 파일명을 Python의 Upper(), lower()처럼
    변환가능하게 하는 스크립트 구현이 목표였습니다.

  • How 🙆‍♂️
    구조는 단순하게 스크립트 경험이 목적이기 때문에 Upper, lower 각각 .sh를 설계하고,
    각각 1)명령 입력 인터페이스 / 2)처리과정로그 / 3)실행결과 및 추가작업로 구조를 설계하였습니다.
    다된 결과물은 하나의 스크립트에서 Upper(upper_ffnex.sh)와 lower(ffnex.sh)를 부르는 식으로 구현하고,
    alias로 언제든 현재경로에서 작업호출가능하게 마무리했습니다.

Code Structure & Result

  • Structure

현재경로에 대한 작업 명령 지정 fenx (lower) / upper(upper)

lower 작업 실행 및 로그 확인

이미 lower처리가 된 파일명이 있는 경우 Upper로 우회작업

  • Result

ffnex.sh (lower 명령)

#!/bin/bash

#ls | tr '[A-Z]' '[a-z]'
filenum=$(ls | wc -l)
str=$(ls)

i=0
a=0
locallist=$(ls -l)
clear
line="-----------------------------------------------------"
echo $line
echo "[fenx] [upper]"
echo $line
echo -n ">>"
read user

if [ $user == "upper" ]
then
     echo "[UPER]"
     .  ~/upper_ffnex.sh


else

        echo $line
        echo "$locallist"
        echo $line
        echo -n "현재 위치에 존재하는 파일명을 변경합니다.(Y/N) >> "
        read user
        
        
        if [ $user == 'Y' ] || [ $user == 'y' ]
        then
            echo $line
        for FILE_NAME in $str; do
        
                name=$(echo $FILE_NAME | tr '[a-z]' '[A-Z]')
                real=$(date "+%Y%m%d/%H:%M:%S")
                mv -f $FILE_NAME $name
                if [ $? == '0' ]
                 then
                  echo "["$real"] "$FILE_NAME ">>" $name "[변경 완료]"
                  i=`expr $i + 1`
                else
                    if [ $FILE_NAME == $name ]
                            then
                                    echo "["$real"]" 이미 변경된 파일 "[변경 실패]"
                            else
                                    echo "["$real"]" $FILE_NAME ">>" $name "[변경 실패]"
                    fi
                  a=`expr $a + 1`
                fi
                #echo "filename " $i":"$FILE_NAME
           echo $line
        done
        fi
        echo [변경 작업 완료 파일 : $i'|' 변경 실패한 작업 : $a] - 종료
        
        if [ $user = "DOWNGRADE" ] || [ $user == "downgrade" ]
        then
                echo -n "전환작업을 시작하시겠습니까?(Y/N) >> "
                read is_dgyn
                if [ $is_dgyn == 'Y' ]
                then
                   . ~/ffnex_test.sh
                fi
        fi
        
        
        
        if [ $user == 'Y' ] && [ $a != 0 ]
        then
         echo -n "실패작업 우회 진행여부(Y/N) >> "
         read usera
         if [ $usera == 'Y' ]
         then
                echo -n "작업 재시작..."
                clear
                ffnex
         fi
        fi
fi

upper_ffnex.sh (upper 명령)

#!/bin/bash

#ls | tr '[A-Z]' '[a-z]'
filenum=$(ls | wc -l)
str=$(ls)

i=0
a=0
locallist=$(ls -l)
clear
line="-----------------------------------------------------"
echo $line
echo "$locallist"
echo $line
echo -n "현재 위치에 존재하는 파일명을 변경합니다.(Y/N) >> "
read user

if [ $user == 'Y' ]
then
    echo $line
for FILE_NAME in $str; do

        name=$(echo $FILE_NAME | tr '[A-Z]' '[a-z]')
        real=$(date "+%Y%m%d/%H:%M:%S")
        mv $FILE_NAME $name
        if [ $? == '0' ]
         then
          echo "["$real"]" $FILE_NAME ">>" $name "[변경 완료]"
          i=`expr $i + 1`
        else
            echo "["$real"]" $FILE_NAME ">>" $name "[변경 실패]"
          a=`expr $a + 1`
        fi
        #echo "filename " $i":"$FILE_NAME
        echo $line
done
fi
echo [변경 작업 완료 파일 : $i'|' 변경 실패한 작업 : $a] - 종료

Shell Script Use Case

Shell Script의 주요 활용사례로는 아래와 같습니다.

1. 디스크 상태 및 파일 시스템 점검
2. 주요 설정파일 권한 점검
3. 프로세스 점검
4. 서비스 배포 

이와 다르게 제가 본 글중 카카오 개발블로그에서 스크립트를 활용한 글을 읽은적이 있습니다.
신규 개발자가 입사하면 처음부터 환경을 셋팅하는데 애를 먹어서 환경셋팅을 스크립트로
설계하여 배포하며 스크립트 환경셋팅을 간편화하여 셋팅메뉴얼보다 더 효과적인 사례를 보았고,

또 서버 보안점검시에도 미리 체크해야할 리스트들을 점검하는
스크립트로 서버점검을 하는 모습도 보았습니다.

이렇게 서버관리에 국한된 사례뿐만 아니라 사용함에 따라
Linux shell script 활용도가 참 많다고 생각이 듭니다.

사실 이쯤되면 파일작업이라면 굳이 다른언어도 있는데 Shell Script라고 생각할수도 있지만,
Bash Script 경험해보고 싶은 마음과 서버에 적재되는 실시간 로그파일의 가공가능성을 확인해보고 싶어
스크립트로 Upper와 lower명령어를 구현해보았습니다.😅

참고자료

0개의 댓글

관련 채용 정보