IT STUDY LOG

[리눅스 운영체제] 08. 자동화 본문

devops bootcamp 4/서비스 운영 기초

[리눅스 운영체제] 08. 자동화

roheerumi 2023. 3. 13. 14:53

# 학습 목표

  • 자동화 
    • 시스템 관리자가 하는 일을 이해할 수 있다.
    • 사용자 및 루트 권한에 대해 이해하고, 사용자 및 그룹 관리를 할 수있다.
    • 파일의 권한을 변경하고 관리할 수 있다.
    • 프로그램과 프로세스의 차이를 이해하고, 프로세스를 확인/종료할 수 있다.
    • 백그라운드 프로세스와 서비스를 이해하고, 관리할 수 있다.
    • cron 및 bash 스크립트를 이용해서 자동화를 할 수 있다.

 


# 학습 내용

1.  bash 스크립트

    • 운영체제 기능, 서비스를 구현할 수 있는 명령어를 사용자에게 받아 실행하 수 있는 인터페이스 제공
    • 종류: 본쉘, C쉘, bash쉘, 콘쉘 등
  • 셸 스크립트 생성
#################### first.sh 생성 실습 ####################
# 쉘스크립트용 테스트 디렉터리 생성
roheerumi@devops:~/devops$ mkdir shell_study
roheerumi@devops:~/devops$ cd shell_study/

# 스크립트 파일 생성
roheerumi@devops:~/devops/shell_study$ vim first.sh

# 스크립트 파일 내용
#!/bin/bash # 어떤 쉘을 사용할 것인지, bash: 배시, sh: 본쉘 등
# 첫번째 주석
echo Hello World        # 두번째 주석

# 실행 권한 없음
roheerumi@devops:~/devops/shell_study$ ./first.sh
bash: ./first.sh: 허가 거부

# 스크립트 파일에 실행 권한 부여 
roheerumi@devops:~/devops/shell_study$ chmod 755 first.sh 
roheerumi@devops:~/devops/shell_study$ ll
합계 12
drwxrwxr-x 2 roheerumi roheerumi 4096  3월 13 11:58 ./
drwxrwxr-x 3 roheerumi roheerumi 4096  3월 13 11:57 ../
-rwxrwxrwx 1 roheerumi roheerumi   65  3월 13 11:58 first.sh*

# 스크립트 파일 실행
roheerumi@devops:~/devops/shell_study$ ./first.sh 
Hello World
#################### first2.sh 생성 실습 ####################
roheerumi@devops:~/devops/shell_study$ vim first2.sh 
#!/bin/bash
# This is a comment!
echo "Hello      World"       # This is a comment, too!
echo "Hello World"
echo "Hello * World"
echo Hello * World
echo Hello      World
echo "Hello" World
echo Hello "     " World
echo "Hello "*" World"
echo `hello` world
echo 'hello' world

roheerumi@devops:~/devops/shell_study$ ./first2.sh 
Hello      World
Hello World
Hello * World
Hello first.sh first2.sh World
Hello World
Hello World
Hello       World
Hello * World
./first2.sh: 줄 13: hello: 명령어를 찾을 수 없음
world
hello world
roheerumi@devops:~/devops/shell_study$
  • 쉘 변수의 선언
    • 쉘 변수 선언시 = 앞 뒤로 띄어쓰기 없어야 함
    • 쉘은 여러 파라메터를 받아 변수 선언
    • 쉘은 변수 타입을 신경쓰지 않음(실제로는 스트링으로 저장됨)
#################### 변수 선언 실습 ####################
# var.sh 파일 생성
roheerumi@devops:~/devops/shell_study$ vim var.sh
roheerumi@devops:~/devops/shell_study$ cat var.sh 
#!/bin/bash

MY_MESSAGE="Hello World"
echo $MY_MESSAGE

# 실행 퍼미션 부여
roheerumi@devops:~/devops/shell_study$ chmod 755 var.sh 

# 수행
roheerumi@devops:~/devops/shell_study$ ./var.sh 
Hello World
#################### 변수 계산 실습 ####################
# x 지역 변수 선언 및 확인
roheerumi@devops:~/devops/shell_study$ x="hello"
roheerumi@devops:~/devops/shell_study$ echo $x
hello

# string 변수에 integer 계산식 수행 
roheerumi@devops:~/devops/shell_study$ expr $x + 1 # expr 프로그램은 수만 취급
expr: non-integer argument

# 변수 할당
roheerumi@devops:~/devops/shell_study$ vim var.sh 
roheerumi@devops:~/devops/shell_study$ cat var.sh 
#!/bin/bash

MY_MESSAGE="Hello World"
MY_SHORT_MESSAGE=hi
MY_NUMBER=1
MY_PI=3.142
MY_OTHER_PI="3.142"
MY_MIXED=123abc

echo $MY_MESSAGE
echo $MY_SHORT_MESSAGE
echo $MY_NUMBER
echo $MY_PI
echo $MY_OTHER_PI
echo $MY_MIXED

# 스크립트 실행 결과
roheerumi@devops:~/devops/shell_study$ ./var.sh 
Hello World
hi
1
3.142
3.142
123abc
#################### 변수 할당 실습 ####################
roheerumi@devops:~/devops/shell_study$ vim var2.sh 
roheerumi@devops:~/devops/shell_study$ chmod 755 var2.sh 
roheerumi@devops:~/devops/shell_study$ cat var2.sh 
#!/bin/bash
echo What is your name?
read MY_NAME
echo "Hello $MY_NAME - hope you're well."

# 실행
roheerumi@devops:~/devops/shell_study$ ./var2.sh 
What is your name?
roheerumi #입력
Hello roheerumi - hope you're well.
  • 쉘 변수의 범위
    • C언어와 유사
    • 선언되지 않은 변수를 읽으려고 하면 빈 문자열 출력(에러, 경고 없음)
    • 변수 앞에  export 붙여 선언 시 전역 변수, 없을 시 지역 변수
    • 셸 스크립트 내에서 변수에 접근할 때는 ${} 사
#################### 변수 선언, 할당 실습 ####################
roheerumi@devops:~/devops/shell_study$ vim myvar2.sh
roheerumi@devops:~/devops/shell_study$ cat myvar2.sh 
#!/bin/sh
echo "MYVAR is :$MYVAR"
MYVAR="안녕"
echo "MYVAR is :$MYVAR"

roheerumi@devops:~/devops/shell_study$ chmod 755 myvar2.sh 
roheerumi@devops:~/devops/shell_study$ ./myvar2.sh 
MYVAR is :
MYVAR is :안녕
#################### 지역변수, 전역변수 실습 ####################
roheerumi@devops:~/devops/shell_study$ MYVAR="지역변수"
roheerumi@devops:~/devops/shell_study$ ./myvar2.sh 
MYVAR is :
MYVAR is :안녕

roheerumi@devops:~/devops/shell_study$ export MYVAR="전역변수"
roheerumi@devops:~/devops/shell_study$ ./myvar2.sh 
MYVAR is :전역변수
MYVAR is :안녕

# 쉘스크립트 내에서 선언한 MYVAR는 지역변수이므로 터미널에서 변수 호출 시 전역변수가 호출됨
roheerumi@devops:~/devops/shell_study$ echo $MYVAR
전역변수

# .(dot) == source명령어를 통해 셸 스크립트 안에서 선언한 환경변수를 스크리브 바깥에서 접근 가능함
roheerumi@devops:~/devops/shell_study$ MYVAR=hello
roheerumi@devops:~/devops/shell_study$ echo $MYVAR
hello
roheerumi@devops:~/devops/shell_study$ . ./myvar2.sh 
MYVAR is :hello
MYVAR is :안녕
roheerumi@devops:~/devops/shell_study$ echo $MYVAR
안녕
#################### 쉘 스크립트 내에서 변수 접근하는 방법 ####################
roheerumi@devops:~/devops/shell_study$ vim user.sh
roheerumi@devops:~/devops/shell_study$ cat user.sh 
#!/bin/bash
echo "What is your name?"
read USER_NAME
echo "Hello $USER_NAME"
echo "I will create you a file called ${USER_NAME}_file"
touch "${USER_NAME}_file" 

# 파일에 실행 퍼미션 부여 후 실행
roheerumi@devops:~/devops/shell_study$ chmod 755 user.sh 
roheerumi@devops:~/devops/shell_study$ ./user.sh 
What is your name?
roheerumi #입력
Hello roheerumi
I will create you a file called roheerumi_file

# 파일 생성 조회
roheerumi@devops:~/devops/shell_study$ ll
합계 32
drwxrwxr-x 2 roheerumi roheerumi 4096  3월 13 13:56 ./
drwxrwxr-x 3 roheerumi roheerumi 4096  3월 13 11:57 ../
-rwxr-xr-x 1 roheerumi roheerumi   87  3월 13 13:17 first.sh*
-rwxr-xr-x 1 roheerumi roheerumi  332  3월 13 13:18 first2.sh*
-rwxr-xr-x 1 roheerumi roheerumi   74  3월 13 13:43 myvar2.sh*
-rw-rw-r-- 1 roheerumi roheerumi    0  3월 13 13:56 roheerumi_file
-rwxr-xr-x 1 roheerumi roheerumi  160  3월 13 13:56 user.sh*
-rwxr-xr-x 1 roheerumi roheerumi  221  3월 13 13:34 var.sh*
-rwxr-xr-x 1 roheerumi roheerumi   91  3월 13 13:37 var2.sh*
  • 셸의 반복문
    • for 문
    • while 문
#################### for문 실습 ####################
roheerumi@devops:~/devops/shell_study/for$ vim for.sh
roheerumi@devops:~/devops/shell_study/for$ chmod 755 for.sh 
roheerumi@devops:~/devops/shell_study/for$ cat for.sh 
#!/bin/bash

for i in 1 2 3 4 5
do
	echo "반복 시작... 숫자 $i"
done
roheerumi@devops:~/devops/shell_study/for$ ./for.sh 
반복 시작... 숫자 1
반복 시작... 숫자 2
반복 시작... 숫자 3
반복 시작... 숫자 4
반복 시작... 숫자 5

# 
roheerumi@devops:~/devops/shell_study/for$ cat ./for2.sh 
#!/bin/bash

for i in hello 1 * 2 goodbye
do
	echo "반복 시작... ${i}는 $i에 할당됨"
done

# 위 스크립트에서 *는 곱하기가 아닌 모든 문자열
# 즉 hello, 1, 디렉토리 내 모든 파일, 2, goodbye로 출력된 것
roheerumi@devops:~/devops/shell_study/for$ ./for2.sh 
반복 시작... hello는 hello에 할당됨
반복 시작... 1는 1에 할당됨
반복 시작... for.sh는 for.sh에 할당됨
반복 시작... for2.sh는 for2.sh에 할당됨
반복 시작... for3.sh는 for3.sh에 할당됨
반복 시작... 2는 2에 할당됨
반복 시작... goodbye는 goodbye에 할당됨
roheerumi@devops:~/devops/shell_study/for$ cat ./for3.sh 
#!/bin/bash

for i in hello 1  2 goodbye
do
	echo "반복 시작... 숫자는 $i에 할당됨"
done
roheerumi@devops:~/devops/shell_study/for$ ./for3.sh 
반복 시작... 숫자는 hello에 할당됨
반복 시작... 숫자는 1에 할당됨
반복 시작... 숫자는 2에 할당됨
반복 시작... 숫자는 goodbye에 할당됨
#################### while문 실습 ####################
# 1. 조건 있는 while
roheerumi@devops:~/devops/shell_study/while$ vim while.sh
roheerumi@devops:~/devops/shell_study/while$ cat while.sh 
#!/bin/bash
INPUT_STRING=하이
while [ "$INPUT_STRING" != "바이" ]
do
  echo "아무거나 타이핑하세요. (끝내려면 바이를 입력하세요.)"
  read INPUT_STRING
  echo "타이핑한 내용: $INPUT_STRING"
done

# 실행 권한 부여 후 실행
roheerumi@devops:~/devops/shell_study/while$ chmod 755 while.sh 
roheerumi@devops:~/devops/shell_study/while$ ./while.sh 
아무거나 타이핑하세요. (끝내려면 바이를 입력하세요.)
ddd
타이핑한 내용: ddd
아무거나 타이핑하세요. (끝내려면 바이를 입력하세요.)
fjadsklfjadskf
타이핑한 내용: fjadsklfjadskf
아무거나 타이핑하세요. (끝내려면 바이를 입력하세요.)
안뇽
타이핑한 내용: 안뇽
아무거나 타이핑하세요. (끝내려면 바이를 입력하세요.)
안녕
타이핑한 내용: 안녕
아무거나 타이핑하세요. (끝내려면 바이를 입력하세요.)
빠이
타이핑한 내용: 빠이
아무거나 타이핑하세요. (끝내려면 바이를 입력하세요.)
바이
타이핑한 내용: 바이

# 2. 무한루프 while문 ctrl + c로 탈출
roheerumi@devops:~/devops/shell_study/while$ vim while2.sh
roheerumi@devops:~/devops/shell_study/while$ cat while2.sh 
#!/bin/bash
while : # :은 항상 참
do
  echo "Please type something in (^C to quit)"
  read INPUT_STRING
  echo "You typed: $INPUT_STRING"
done

roheerumi@devops:~/devops/shell_study/while$ ./while2.sh 
Please type something in (^C to quit)
fajkdsfl
You typed: fajkdsfl
Please type something in (^C to quit)
gldad
You typed: gldad
Please type something in (^C to quit)
fajkdsfl
You typed: fajkdsfl
Please type something in (^C to quit)
^C

# 3. 입력 재지정
# myfile.txt 파일 내용
roheerumi@devops:~/devops/shell_study/while$ cat myfile.txt 
this file is called myfile.txt and we are using it as an example input.
hello
gday
bonjour
hola

# while3.sh 파일 내용
roheerumi@devops:~/devops/shell_study/while$ cat while3.sh 
#!/bin/bash
while read input_text
do
  case $input_text in
        hello)          echo English    ;;
        howdy)          echo American   ;;
        gday)           echo Australian ;;
        bonjour)        echo French     ;;
        "guten tag")    echo German     ;;
        *)              echo Unknown Language: $input_text
                ;;
   esac
done < myfile.txt

roheerumi@devops:~/devops/shell_study/while$ ./while3.sh 
Unknown Language: this file is called myfile.txt and we are using it as an example input.
English
Australian
French
Unknown Language: hola
  • 셸의 조건문
    • [ : 조건문 프로그의 심볼릭 링크
    • 아래 두 문장은 동일하게 작동
      if [ "$X" -nt "/etc/passwd" ]; then
            echo "X is a file which is newer than /etc/passwd"
      fi
      [ "$X" -nt "/etc/passwd" ] && \
            echo "X is a file which is newer than /etc/passwd"
#################### 조건문 실습 ####################
# [는 프로그램이므로 앞 뒤로 공백이 들어가야 함
roheerumi@devops:~/devops/shell_study/if$ type [
[ 는 쉘 내장임
roheerumi@devops:~/devops/shell_study/if$ which [
/usr/bin/[
roheerumi@devops:~/devops/shell_study/if$ ls -l /usr/bin/[
-rwxr-xr-x 1 root root 59736  9월  5  2019 '/usr/bin/['
roheerumi@devops:~/devops/shell_study/if$ ls -l /usr/bin/test
-rwxr-xr-x 1 root root 55640  9월  5  2019 /usr/bin/test

# 조건문 테스트
roheerumi@devops:~/devops/shell_study/if$ export X=5
roheerumi@devops:~/devops/shell_study/if$ vim test.sh
roheerumi@devops:~/devops/shell_study/if$ cat test.sh 
#!/bin/bash

if [ "$X" -lt "0" ]
then
  echo "X is less than zero"
fi
if [ "$X" -gt "0" ]; then # ; : 라인 2개 합치기 위해 세미콜론 사용
  echo "X is more than zero"
fi
[ "$X" -le "0" ] && \ # \ : 라인이 끝난게 아니라 하나의 문장처럼 인식
      echo "X is less than or equal to  zero"
[ "$X" -ge "0" ] && \
      echo "X is more than or equal to zero"
[ "$X" = "0" ] && \
      echo "X is the string or number \"0\""
[ "$X" = "hello" ] && \
      echo "X matches the string \"hello\""
[ "$X" != "hello" ] && \
      echo "X is not the string \"hello\""
[ -n "$X" ] && \
      echo "X is of nonzero length"
[ -f "$X" ] && \
      echo "X is the path of a real file" || \
      echo "No such file: $X"
[ -x "$X" ] && \
      echo "X is the path of an executable file"
[ "$X" -nt "/etc/passwd" ] && \
      echo "X is a file which is newer than /etc/passwd"

roheerumi@devops:~/devops/shell_study/if$ chmod 755 test.sh 
roheerumi@devops:~/devops/shell_study/if$ ./test.sh 
X is more than zero
X is more than or equal to zero
X is not the string "hello"
X is of nonzero length
No such file: 5
# while 문을 사용한 null 문자 판별 종료
X=0
while [ -n "$X" ]
do
  echo "Enter some text (RETURN to quit)"
  read X
  echo "You said: $X"
done

# while 문 내에 조건문으로  null 문자 판별 종료
X=0
while [ -n "$X" ]
do
  echo "Enter some text (RETURN to quit)"
  read X
  if [ -n "$X" ]; then
    echo "You said: $X"
  fi
done

# 두 문장으로 나누어서 판별
if [ "$X" -lt "0" ]
then
  echo "X is less than zero"
fi

..........  and  ........

if [ -n "$X" ]; then
  echo "You said: $X"
fi
  • 조건문 내 옵션 의미
옵션 의미
-a, -e 파일이 존재한다면 참
-S 파일이 소켓이라면 참
-nt 파일이 더 새로운 파일이라면 참
-ot 파일이 더 오래된 파일이라면 참
-ef 경로가 동일한 파일을 가리킨다면 참
-O 파일이 현재 테스트하고 있는 사람의 파일이라면 참
-eq (=) (산술) 두 값이 같다면 참
-ne (!=) (산술) 두 값이 같지 않다면 참
-gt (>) (산술) 값1이 값2보다 크다면 참
-ge (>=) (산술) 값1이 값2보다 크거나 같다면 참
-lt (<) (산술) 값1이 값2보다 작다면 참
-le (<=) (산술) 값1이 값2보다 작거나 같다면 참
-a (and) (산술) 조건1과 조건2의 결과가 모두 참이면 참
-o (or) (산술) 조건1과 조건2의 결과 중 하나가 참이면 참
없음 (문자열) 빈문자열이 아니면 참
= 또는 == (문자열) 두 문자열이 같다면 참
!= (문자열) 두 문자열이 다르다면 참
-n  (문자열) 문자열이  null이 아니라면 참
-z (문자열) 문자열이  null라면 참
  • 조건문 사용 예시
# 방법1
if [ ... ]
then
  # if-code
else
  # else-code
fi

# 방법2
if [ ... ]; then
  # do something
fi

# 방법3
if  [ something ]; then
 echo "Something"
 elif [ something_else ]; then
   echo "Something else"
 else
   echo "None of the above"
fi
출처 : https://rhrhth23.tistory.com/4, https://www.shellscript.sh/first.html, https://www.shellscript.sh/variables1.html, https://www.shellscript.sh/loops.html, https://www.shellscript.sh/test.html

 

Comments