[23.01.20] 63일차 [클라우드]

W·2023년 1월 20일
0

국비

목록 보기
92/119

case문

  • 변수의 값에 따라 여러 가지 다른 작업을 할 때 사용

  • case 변수 in
    pattern1)
    명령어;;
    pattern2)
    명령어;;
    *)
    명령어
    esac

  • vi case1.sh
    1을 입력 : 아이틸
    2를 입력 : 부산이 출력

#!/bin/sh
case "$1" in
 1)
  echo "itwill";;
 2)
  echo "busan";;
 *)
  echo "1 또는 2를 입력하세요!"
esac

[root@localhost ~]# sh case1.sh
1 또는 2를 입력하세요!
[root@localhost ~]# sh case1.sh 1
itwill
[root@localhost ~]# sh case1.sh 2
busan

[퀴즈_Case.sh]
/root/test/newfile.txt
파일이 있다면 "파일이 존재합니다."
파일이 없다면 "새로운 파일을 생성할까요?" 라는 문구를 출력하고
'y'를 입력하면 newfile.txt의 빈파일을 생성
'n'를 입력하면 "파일을 생성하지 않았습니다."를 출력
하는 셸스크립트를 작성

if [ -e /root/test/newfile.txt ]
  then
  echo "파일이 존재합니다."
else
  echo "파일이 존재하지 않습니다!"
  echo -n "새로운 파일을 생성할까요? (y/n) : "
  read answer
  case $answer in
   yes|y|Y|Yes|YES)
   touch /root/test/newfile.txt;;
   no|n|N|No|NO)
   echo "파일을 생성하지 않았습니다.";;
   *)
   echo " y 또는 n을 입력하세요! "
   exit 1;;
   esac
fi

셸 프로그래밍 작성

숫자계산

  • 셸 프로그래밍에서는 변수에 넣은 값은 문자열로 취급
  • 변수에 들어 있는 값을 '+', '-', '*', '/' 등의 연산을 하려면 'expr' 키워드를 사용
  • 'expr' 키워드는 '인자(argument)' 항목을 구분하여 명령을 수행
  • 이때 각 '인자'는 공백으로 구분
  • 'expr' 사용 시 역따옴표 (`)기호로 묶어야 한다!!
  • 수식에괄호를 사용하려면 반드시 역슬래시 ('\')를 붙어야 한다!!
  • 사칙연산 시 '+', '-', '/'는 그냥 사용하면 되지만 '*'는 예외적으로 앞쪽에 역슬래시('\')를 붙여야함

vi calculate.sh

#!/bin/sh
echo "두 숫자를 입력받아 덧셈값을 출력하는 셸 프로그램>입니다."
echo -n "첫 번째 숫자를 입력해주세요 : "
read A
echo -n "두 번째 숫자를 입력해주세요 : "
read B
C=`expr $A + $B`
echo "두 숫자의 합은 $C 입니다."

vi calculate2.sh

#!/bin/sh
num1=100
num2=$num1+200
echo $num2
num3=`expr $num1 + 200`
echo $num3
num4=`expr \( $num1 + 200 \) / 10 \* 2`
echo $num4
exit 0

vi expr1.sh

#!/bin/sh
echo -n "Please Insert the String : "
read str
echo `expr length $str`

for문

  • 셸 프로그래밍에서 사용하는 for문은 일반적인 프로그래밍 언어의 for문과 약간 다름
  • for 변수 in 값(원소1), 값2, 값3 ....
    do
    반복할 문장
    done
sum=0
for i in 1 2 3 4 5 6 7 8 9 10
do
sum=`expr $sum + $i`
done

[root@localhost ~]# sh for1.sh
1부터 10까지의 합은 55 입니다.

vi for2.sh

#!/bin/sh
echo "디렉터리 내의 셸 스크립트 파일을 찾아 내용을 보여>주는 셸 스크립트입니다."
echo -n "현재 디렉터리의 내용을 보려면 'y'를 다른 디렉터
리의 내용을 보려면 'n'를 입력하세요 : "
read answer
if [ $answer = 'y' ]
  then
    for fname in $(ls *.sh)
    do
      echo "------------ $fname -----------"
      cat $fname
    done
elif [ $answer = 'n' ]
  then
    echo -n "보고 싶은 디렉터리를 입력하세요 : "
    read dir
    for fname in $(ls $dir/*.sh)
    do
     echo "------------ $fname ------------"
     cat $fname
    done
else
echo "y 또는 n을 입력하세요!!"
fi

while문

  • 조건이 만족하는 동안 do와 done 사이의 명령어를 반복 실행
  • 형식
    while [조건문]
    do
    명령어
    done

vi while1.sh

#!/bin/sh
while [ 1 ]
do
  echo "ITWILL"
done

=> ITWILL 반복되어 출력
=> Ctrl + C 를 입력하여 빠져나옴!!

[퀴즈_while2.sh]

while문을 사용하여 1에서 10까지 합을 출력하는 셸 스크립트 작성

#!/bin/sh
sum=0
i=1
while [ $i -le 10 ]
do
 sum=`expr $sum + $i`
 i=`expr $i + 1`
done
echo "1부터 10까지의 합은 : $sum이다."
exit 0

[퀴즈_while3.sh]

  • while문을 사용하여 패스워드를 입력하는 셸 스크립트 만들기.
  • 올바른 패스워드인 'itwill'로 입력하면 종료하고,
    틀린 패스워드를 입력 받으면 계속 패스워드를 입력받는 셸 스크립트 작성
#!/bin/sh
echo -n "비밀번호를 입력하세요: "
read password
while [ $password != 'itwill' ]
do
 echo -n "비밀번호가 다릅니다. 다시 입력하세요: "
 read password
done
echo "올바른 비밀번호입니다!"
exit 0

Cron

  • 리눅스에서 주기적으로 반복되는 일을 자동으로 실행할 수 있도록 시스템 작업을 예약해 놓은 것.
  • cron 과 관련된 데몬(서비스)은 crond이고
    관련 파일은 /etc/crontab 이다.
  • /etc/crontab은 필드 개념을 가지고 있으며 각 필드는
    [분][시][일][월][요일][사용자][실행명령 또는 셸 스크립트]
  • [분] : 0 ~ 59
    [시] : 0 ~23
    [일] : 1 ~ 31
    [월] : 1 ~ 12
    [요일] : 0 ~ 7(0 or 7 = 일요일, 1=월,2=화,3=수...)

crontab

  • 기능 : 사용자의 crontab 파일을 관리
  • 형식 : crontab [-u 사용자ID][옵션][파일이름]
  • 옵션
    -e : 사용자의 crontab 파일을 편집
    -l : crontab 파일의 목록을 출력
    -r : crontab 파일을 삭제
    -u : root 권한자가 해당 사용자의 crontab 파일을 다룰 때 사용

crontab 간단 예시

  1. 00 05 1 * root cp -r /home /backup
    => '
    '의 의미는 모든 요일, 매월을 의미
    => '요일은 상관없이' '매월' '1일' '새벽 5시' '00분'에
    /home 디렉터리가 /backup 디렉터리에 복사된다.

cron 시작

  • 리눅스가 처음 설치될 때 crond 가 같이 설치되고 자동으로 동작
  • systemctl status crond
    => Active: active (running)

crontab -l
=> no crontab for root
=> crond는 사용자별로 동작
현재 root 사용자의 cron(자동화 예약)은 없다!

crontab -e
내용을 넣지 않고 : wq
no crontab for root - using an empty one
crontab: installing new crontab

ls /var/spool/cron/
=> root
cat /var/spool/cron/root
=> 아무 내용이 없음.

crontab -e
01 * * * * sh /root/hello.sh
:wq
=> (요일무관) 매월 매일 매시 1분에 /root/hello.sh 셸 스크립트 실행

crontab -l
01 * * * * sh /root/hello.sh

cat /var/spool/cron/root
01 * * * * sh /root/hello.sh

vi hello.sh
#!/bin/sh
echo "Hello" >> /root/hello.txt
exit 0
:wq

date
=> 현재 시각을 출력

date -s 00:00:00
=> 리눅스에 설정된 시각을 '00시00분00초'로 변경

Q. 만약 1분마다 또는 10분마다 hello.sh를 실행하려면?

A. 마다 라는 표현은 */
=> 1분마다 */1, 10분마다 */10

* * * * * sh /root/hello.sh
=> 1분마다 hello.sh를 실행
*/1 * * * * sh /root/hello.sh
=> 1분마다 hello.sh를 실행

/10 * * * sh /root/hello.sh
=> 10분마다 hello.sh를 실행
=> 0,10,20,30,40,50 * * * * sh /root/hello/sh 로도 표현 가능!!

crontab -r
=> 삭제!!

시스템의 crontab 설정

  • crontab은 사용자 별로 관리
  • /etc/crontab 파일을 설정하면 시스템 전체의 정기적인 동작을 설정
  • 보안에 좋지 않으므로 각 사용자별 cron 설정을 추천!!!

0개의 댓글