앎을 경계하기

[가짜연구소3기] Data Engineer

[가짜연구소 3기] 데이터 엔지니어링 54 - Functions and Automation

양갱맨 2021. 10. 2. 15:53

Bash 스트립트에서 기본 함수 빌드하기

bash script에서의 함수 형태

function 함수이름 () {
	내부코드 # 이전에 배운 루프, 조건문, shell-in-a-shell 모두 가능
	return 반환값
}

예제1

function print_hello () {
	echo "Hello World!"
}

print_hello
Hello World!

예제2

화씨에서 섭씨로 변환하는 함수 만들기

temp_f=30
function covert_temp () {
	temp_c=$(echo "scale=2; ($temp_f -32) * 5 / 9" | bc)
	echo $temp_c
}
convert_temp
-1.11

인수, 반환값, 스코프

function print_filename {
	echo "The first file was $1"
	for file in $@
	do
		echo "This file has name $file"
	done
}
print_filename "LOTR.txt" "mod.txt" "A.py"

앞에서 배운대로 ARGV 값에 접근하는 것과 같다.

일반적으로 다른 프로그래밍 언어에서는 변수의 스코프(전역/지역)에 따라 접근이 가능/불가능한데, bash에서는 기본적으로 global 하게 변수들이 잡힌다.

지역변수로 제한하고 싶으면 local 명령을 사용해야한다.

function print_filename {
	local first_filename=$1
}
print_filename "LOTR.txt" "model.txt"
echo $first_filename

$first_filename을 local로 제한했기 때문에 접근할 수 없어서 빈 줄이 출력된다.

또한, Bash의 함수 return은 특정 값을 반환하는 것이 아니라 그 함수의 수행 성공(0)과 실패(1-255)를 반환한다.

이 값은 $? 변수에 저장된다.

function function-2 {
	echlo # error
}
function_2
echo $? #function_2에 대한 에러를 반환한다. 
script.sh: line 2: echlo: command not found 127

Cron을 사용해서 일정에 따라 실행되도록 프로그래밍 하는 방법

croncrontab이라는 것에 의해 구동된다.

실행 코드와 시기를 crontab에 알려주는 cronjobs 가 포함되어 있다.

crontab -l #현재 프로그래밍 한 일정을 확인할 수 있다.

cronjob 예제

5 1 * * * bash myscript.sh

매달 매일 오전 1시 5분에 myscript.sh 를 수행한다.

15 14 * * 7 bash myscript.sh

매주 일요일 오후 2시 15분에 myscript.sh를 수행한다.

cronjob 구조의 장점

특정 시간마다 여러번 프로그램을 실행할 수 있고 일정 시간 단위로 실행도 가능하다.

15,30,45 * * * *로 설정하면 매 시간 15분 30분 45분에 수행된다.

*/15 * * * *로 설정하면 매시간 15분 마다 수행된다.

cronjob 사용 예제

extract_data.sh라는 파일을 매일 오전 1시 30분에 수행되도록 등록하려고 한다.

  1. crontab -e를 사용해서 cronjobs를 편집한다.
    1. 어떤 편집기를 사용할 것인지 선택한다.
  1. cronjob생성
    1. 매일 오전 1시 30분이니까 30 1 * * * extract_data.sh 로 등록
  1. crontab 저장 및 종료
  1. 올바르게 프로그래밍 되었는지 확인
    1. crontab -l30 1 * * * extract_data.sh 나오면 성공