일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- AWS구축
- AWS배포자동화
- terraform기본
- 주피터노트북 설치
- terraform따라하기
- aws
- aws terraform
- AWS 공격테스트
- Cissp sdlc
- 리눅스기초
- 쉘스크립트
- linux명령어
- terraform기초
- 직무분리
- 최소권한
- aws기본
- aws따라하기
- blue/green배포
- AWS CodeDeploy
- AWS실습
- 리눅스명령어
- Linux
- opt/anaconda3/bin/jupyter_mac.command
- 리눅스기초명령어
- GDPR
- aws기초
- terraform with aws
- AWS CI/CD
- cissp
- 리눅스
ysuekkom의 IT study note
[linux 기초] 명령어 실습편 - 초간단 쉘 스크립트 작성II - 조건문/반복문 본문
[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
<실행결과>
'OS > linux' 카테고리의 다른 글
[linux 기초] 명령어 실습편 - 초간단 쉘 스크립트 작성IIII -대화식 쉘스크립트 구성 (1) | 2022.10.15 |
---|---|
[linux 기초] 명령어 실습편 - 초간단 쉘 스크립트 작성III -함수/배열 (0) | 2022.10.15 |
[linux 기초] 명령어 실습편 - 초 간단 쉘 스크립트 작성 (1) | 2022.10.13 |
[linux 기초] 명령어편 - 검색, 입출력 관련 (1) | 2022.10.13 |
[linux 기초] 명령어편 - 네트워크 관련 (1) | 2022.10.13 |