ysuekkom의 IT study note

[linux 기초] 명령어 실습편 - 초간단 쉘 스크립트 작성II - 조건문/반복문 본문

OS/linux

[linux 기초] 명령어 실습편 - 초간단 쉘 스크립트 작성II - 조건문/반복문

ysuekkom 2022. 10. 14. 10:47

[linux 기초] 명령어 실습편 - 초간단 쉘 스크립트 작성II -조건문/반복문

개인 공부를 위한 기록용으로 일부 과거 자료 이전

 

###간단  스크립트
 -조건문/반복문
 -함수/배열
 -리다이렉션의 활용
 -대화식 구성/메뉴구성

 

이전 포스팅에서 다뤄봤던 아주 기초적인 명령어를 바탕으로, 간단 쉘 스크립트를 작성하는 실습을 진행한다.

 

Path: /root/SHELL

>vi helloworld.sh

>실행 에러 이유: 현재 위치인 /root/SHELL PATH 등록되어있지 않기 때문

>./helloworld.sh 실행하거나, path사용하여 /root/SHELL/helloworld.sh 실행해야 함

>/root/SHELL/helloworld.sh 실행 , 허가거부 에러 발생

실행권한을 부여해야만 실행 가능함(root계정이라도)

Root 권한 모두 부여 >chmod

이후 현재 디렉터리의 helloworld.sh 실행하면 실행

참고)Bash 권한이 있기 때문에 실행 가능

참고: #!/usr/bin/env python, #!/usr/bin/env perl

 


###조건문/반복문

if [조건문 1 ]; then
 조건문1 참일 경우 실행  명령어


elif [ 조건문2 ]; then
 조건문1 거짓이고, 조건문2 참일 경우 실행  명령어


else
 조건문1, 2 모두 거짓일 경우 실행  명령어


fi

 

<비교표 참고>

숫자 비교는 등호/부등호로 표현

Shell script 영어단어로 표현

 

 

<실습>

서버의 load average가 5 이상이 되면 메일로 알람을 보내는 쉘 스크립트 작성

>>조건문만 확인

>vi la.sh  

#!/bin/bash
LOAD=$(load average 가져오는 명령어)  //변수=${명령어}
If["${LOAD}" -ge 5 ]; then                        //${변수}
    슬랙/텔레그램/메일로 경고메시지를 날리는 명령어
esle
       echo "No problem"
fi

 

//파일비교문: 파일인지, 파일이 존재하는지, 권한이 있는지, 디렉터리인지 등등

-e file : 파일이 존재하는지 확인

 

>nginx 다운로드

>yum install nginx

>systemctl start nginx

>systemctl status nginx

 

 

 

>vi /etc/nginx/nginx.conf

 

Pid 확인 , cat으로 내용 확인

 

nginx 멈추려고 , 어떤 로직으로 움직이는가?

>>멈추거나 시작할 pid 확인하기 때문(파일 존재 여부 -e file 옵션으로 확인하는 .

#!bin/bash


PID="/run/nginx.pid"


if [ -e "${PID}" ] ; then
       kill nginx pid번호를 읽어서 죽이는 명령
else   //파일이 존재하지 않을 
       echo "nginx 실행 중이 아닙니다."   
fi

 

# 문자열 비교문 등호를 가장 많이 사용함 A = B, A != B, -z A(문자열을 받아오고 문자열이 들어가있는지 아닌지 확인 ( -z A A 문자열길이가 0인지 확인하는 명령어)

 

 

 

<cent1,2,3 서버를 이용하여 실습하기> ---cent1,2,3 서버 구축 안되어있을 경우 생략

>vi server_check.sh    //스크립트 작성

#!bin/bash

 

SVR_NAME=$(hostname)


if [ "${SVR_NAME}" = "cent1" ]; then
   echo " 서버입니다."
else
   echo " 서버가 아닙니다."
fi

>chmod 700 server_check.sh    //권한 부여

>./server_check.sh     //스크립트 실행

웹서버입니다.      //스크립트 결과: cent1 ==nginx 사용하는 웹서버

>scp server_check.sh cent2:/root      cent2서버에 복사

 

##cent2서버 접속 ,

>mv server_check.sh SEHLL    //cent1 에서 복사한 sever_check SHELL 디렉터리로 이동

>cd SHELL

>hostname

>cat server_check.sh

>./server_check.sh     //cent2 웹서버가 아니기때문에

> 서버가 아닙니다.    //스크립트 결과 출력

 

 

<파일이 존재한다면 ~~ 실행해라 라는 복합 >

AND OR 조건을 여러 붙이기.

[ 조건1 -a 조건2 -a 조건3 ] : -a == AND : 모두 참이어야

[ 조건1 -o 조건2 -o 조건3 ] : -o == OR : 3 모두 참이 아니면 거짓, 하나라도 참이면

[ 조건1 -a 조건2 -o 조건3 ] : 조건 1,2 참이거나, 조건3 참일

 

파일이 있는지, 파일인지 확인

[ -e /var/log/message -a -f /var/log/message ] 메시지로그가 존재하는지, 디렉터리가 아니라 파일인지 확인

 


###여러 조건을 한 번에 확인하는 case문

 

-조건문

case 변수 in
 패턴1)
   패턴 1 참일 경우 실행 명령어;;
 패턴2)
   패턴 2 참일 경우 실행 명령어;;



 *)
 위에서 지정한 모든 패턴에 해당이 안되는 경우 실행 명령어;;


 esac

 

#!bin/bash


## ./nginx_ctl.sh start        : nginx start
## ./nginx_ctl.sh stop        : nginx stop
## ./nginx_ctl.sh reload     : nginx reload
## ./nginx_ctl.sh configtest : nginx.conf 문법을 확인


>>유저가 입력한 부분(파라미터 ==start/stop/reload/configtest ) 확인하고 (변수에 넣고) 변수와 일치하면 실행시키기
참고) 파라미터 인식하는 방법

## ./nginx_ctl.sh a b c

## $! : a, $2 : b, $3 : c


CMD=$1


case "${CMD}" in
start)
  NGINX 시작하는 명령;;
stop)
  NGINX 종료하는 명령;;
reload)
  NGINX 재시작하는 명령;;
configtest)
  NGINX 설정파일을 확인하는 명령;;
*)
  echo "사용방법: ./nginx_ctl.sh  {start|stop|reload|configtest}";;


esac

 


#반복문

로그 디렉터리 파일을 관리한다거나, 빈텍스트 파일을 읽어 처리한다거나 사용

 

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

  

 

<다른 서버  접속해서 load average 확인하기>

 

>>다른 서버 접속 ssh ${변수} "실행할 명령어"

(현재 서버 연결 안되어있기 때문에 not known)

 

>>만약 변수가 많을 경우

for NUM in ${seq 1 100)

do

   echo "cent${NUM}"

   ssh cent${NUM} "uptime"

   echo

done

 

>>serverlist 변수 받아오기

 

<실행결과>

 

 

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

 

>vi while_test.sh

 

 

>chmod 700 while_test.sh

>./while_test.sh

(현재 서버 연결 안되어있어서 not known 상태)

 

<filelist while 조건문 사용 가능 :: read>

>vi while_test.sh

>>done 에서 serverlist.sh 넣어주고 while read SVR 넣어서 조건반복

serverlist.sh == cent1, cent2, cent3

 

<실행결과>