반응형
해당 글의 내용은 모두의연구소에서 진행한
" 처음부터 시작하는 우분투 "풀잎스쿨 자료를 바탕으로 했습니다.
선요약
- Shell Script에 대한 정리
- Shell이란?
- Shell Script 작성팁
- Shell Script 예시
내용
1) Shell Script란?
- 리눅스 명령어로 이루어진 스크립트
- 리눅스 명령어를 차례대로 실행
- 리눅스 명령어를 조합하여 작업을 자동화하는 용도로 사용
2) shell script 작성 시 팁
- 셸 스크립트 정의
- Shell Script 파일 작성 시 상단에 #!/bin/sh 라고 적어주어 sh 파일임을 명시
- 셸 스크립트 파일 작성 시 작성법
- vim으로 test 라는 셸 스크립트 파일을 만들 때
- ex) vim test.sh
- vim으로 test 라는 셸 스크립트 파일을 만들 때
- 셸 스크립트 실행 명령어
- sh [파일명]
- 변수 선언
- ex) x = $10
# 셸 스크립트 내 변수 선언
#!/bin/sh
x = $1
y = $2
Z = $3
# 변수 출력 시 사용하는 명령어
echo $x $y $z
# 출력 값 1, 2, 3
- 변수 접근 및 출력
- 변수명 앞에 $ 를 붙여야 함
- echo $x
- 외부에서 인자 넣기
- ex) test 라는 파일명을 가진 셸스크립트 파일이 있다고 가정
#!/bin/bash echo "1st param = $1" echo "2nd param = $2" echo "3rd param = $3" echo "The number of params = $#"
sh test.sh 111 222 333
입력
# 결과물 1st param = 111 2nd param = 222 3rd param = 333 The number of params = 3
- 셸 스크립트 내 비교연산자 인자 (while loop 작성법 내 예시 참고)
- eq - equal ( = )
- ne - not equal ( <> )
- lt - little ( < )
- le - little or equal ( <= )
- gt - greater ( > )
- ge - greater or equal ( >= )
- 사칙연산 계산을 위한 expr 사용
- shell script 내에서 계산을 하기 위해 사용
- 산술 : +, -, *, /, %
- 논리 : |(or), &(and)
- 관계 : =, >, >=, <, <=, !=
- 문자열 : ':'(일치 혹은 substitute)
- expr도 명령어이기 때문에 연산자와 피연산자는 (space)로 구분
- 공백을 안주면 5+1을 하나의 문자열로 인식
$ expr 5+1 5+1 $ expr 5 + 1 6
- expr에 사용되는 인수들을 통째로 따옴표처리하면,
$ expr '5 * 3' 5 * 3
- expr에 연산자 / 피연산자의 구분되어 처리되지 않고 하나의 문자열로 취급
- 참고사이트
- shell script 내에서 계산을 하기 위해 사용
- for loop 작성법
#!/bin/sh
for x in array; do
[명령어]
done
- 예시
#!/bin/sh
days="20221011 20221012 20221013 20221014"
for day in $days; do
echo $day
done
# 실행 결과물 20221011 \n 20221012 \n 20221013 \n 20221014
- while loop 작성법
#!/bin/sh
while [ 조건 ]
do
[명령어]
done
- 예시
#!/bin/sh
x=0
while [ $x -lt 10 ] # lt는 < 의 의미
do
x=$(expr $x + 1)
echo $x
done # break 의미
- if 문 작성법
#!/bin/sh
if [ 조건 ]; then
[명령어]
else if
[명령어]
else
[명령어]
fi
-
- 예시
#!/bin/sh
x=$1
y=$2
if [ $x -lt $y ]; then
echo $y is big than $x
else #or else if
echo $x is bigger than $y
fi
# 중요 : [ $x -lt $y ]에서 공백에 신경 써주세요. 붙여서 쓰면 오류가 나옵니다.
3) shell script 예시
- 예시1 : 네트워크가 불안정한 상황으로, 몇시 쯤에 인터넷이 끊기는 지 확인하고 싶다고 가정
- ping -c 1 8.8.8.8 | grep received | awk -d',' '{print $6}' 를 입력
- ping -c 1 8.8.8.8 ⇒ google.com에 한 번 접속하라| awk -d’,’ ‘{print $6}’ ⇒ 출력을 “,”로 나눈 뒤, 6번째 부분을 출력하라
- | grep received ⇒ 앞의 결과에서 received 가 들어간 열을 저장해라
- 하지만 사람이 매시 매분마다 이렇게 작성할 수는 없기에 하단 셸 스크립트 파일처럼 작성
- ping -c 1 8.8.8.8 | grep received | awk -d',' '{print $6}' 를 입력
#!/bin/sh
test_time=$(date +"%Y-%m-%d %H:%M:%S")
loss=$(ping -c 1 8.8.8.8 | grep received | awk -d',' '{print $6}')
if [ $loss = 0% ];then
echo $test_time connection is good >> web_connection.log
else
echo $test_time connection is not good >> web_connection.log
fi
- 예시2 : 특정 프로세스가 제대로 동작하고 있는 지 확인
- 50% 확률로 오류를 내는 프로그램(fake_program.py)이 있다고 가정합니다. (별로 중요한 의미는 없습니다.) 해당 프로그램이 현재 실행하고 있는지 확인하는 파일입니다.
- fake_program.py 내용
- 50% 확률로 오류를 내는 프로그램(fake_program.py)이 있다고 가정합니다. (별로 중요한 의미는 없습니다.) 해당 프로그램이 현재 실행하고 있는지 확인하는 파일입니다.
from random import randint
from datetime import datetime
import time
# 50% 확률로 0 또는 1
def fake_process():
if randint(0,1) == 1:
return True
else:
return False
if __name__== '__main__':
while True:
time.sleep(10)
now= datetime.now().strftime("%Y-%m-%d %H:%M:%S")
if fake_process():
print(f'{now} program works')
else:
print(f'{now} program does not work')
- 해당 프로그램이 현재 실행되는지 확인하는 sh 파일
#!/bin/sh
#~/check_process.sh
program=$(ps aux |grep $1 | grep -v grep | grep -v check_process)
status=$(echo $program |awk '{print $8}')
if [ -z "$program" ]; then
echo $1 is not work
else
echo "process status is $status"
fi
반응형
'데이터 관련 > Linux(Ubuntu)' 카테고리의 다른 글
[리눅스] 1.5 명령어와 친해지기 (1) | 2023.12.31 |
---|---|
[리눅스] 1.3 시스템 살펴보기 (0) | 2023.12.31 |
[리눅스] 1.2 파일시스템 탐색 (0) | 2023.12.31 |
[리눅스] 1.1 쉘이란 무엇인가? (1) | 2023.12.31 |