Bash 스크립트 작성 실습

안녕하세요! 오늘은 Bash 스크립트 작성 실습을 통해 컴퓨터와 더 친해지는 시간을 가져보려고 해요. 마치 새로운 언어를 배우는 것처럼 신기하고 재밌을 거예요. Bash 스크립트는 일종의 컴퓨터와의 대화 방법인데, 이걸 알면 반복적인 작업을 자동화할 수 있어서 정말 편리해요. 변수와 연산자, 조건문, 반복문 등 마법 같은 기능들을 배우면 컴퓨터가 마치 내 손발처럼 움직이는 경험을 할 수 있답니다! 기본 구조부터 실전 예제까지 차근차근 알아갈 테니 걱정하지 마세요. 함께 Bash 스크립트의 세계로 떠나볼까요?

 

 

Bash 스크립트 기본 구조

Bash 스크립트, 처음 접하면 낯설 수 있지만, 걱정 마세요! 마치 레고 블록을 조립하듯, 기본 구조만 이해하면 생각보다 쉽게 작성할 수 있답니다. 자, 이제 함께 Bash 스크립트의 세계로 떠나볼까요?

셔뱅(Shebang)

가장 먼저, Bash 스크립트는 ‘셔뱅(Shebang)’이라고 불리는 특별한 줄로 시작해요. #!/bin/bash 이 친구가 바로 그 주인공인데요, 이 줄은 스크립트를 실행할 인터프리터를 지정하는 역할을 한답니다. 마치 영화 시작 전에 나오는 제작사 로고처럼 말이죠! 셔뱅은 스크립트의 첫 줄에 꼭! 위치해야 한다는 점, 잊지 마세요.

명령어와 제어문

그 다음은 스크립트의 핵심 내용, 바로 명령어와 제어문들이에요. echo, ls, cd와 같은 명령어들은 터미널에서 직접 입력하는 것처럼 스크립트 내에서도 자유롭게 사용할 수 있어요. 마치 마법 주문처럼 원하는 작업을 뚝딱! 해결해준답니다. 게다가 변수, 조건문, 반복문 등 다양한 제어문들을 활용하면 스크립트를 더욱 강력하고 유연하게 만들 수 있죠. 이 부분은 나중에 자세히 다뤄볼 테니 기대해주세요!

변수

Bash 스크립트 작성 시 변수는 정말 중요해요. 마치 요리 레시피에서 재료와 같은 역할을 하거든요. 변수를 사용하면 값을 저장하고, 필요할 때마다 불러와서 사용할 수 있어요. 예를 들어, name="Alice"처럼 변수에 값을 할당하고, echo "Hello, $name!"처럼 변수를 사용해서 출력할 수 있답니다. 변수 이름은 문자, 숫자, 밑줄(_)로 구성할 수 있지만, 숫자로 시작할 수는 없다는 점, 기억해두세요!

간단한 예제

자, 이제 간단한 예제를 통해 Bash 스크립트의 기본 구조를 살펴볼까요? 아래 예제는 현재 날짜와 시간을 출력하는 스크립트입니다.

#!/bin/bash

# 현재 날짜와 시간 출력
current_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "현재 시간: $current_time"

스크립트의 첫 줄은 셔뱅으로, Bash 인터프리터를 지정하고 있어요. 두 번째 줄은 주석인데요, ‘#’으로 시작하는 줄은 스크립트 실행에 영향을 주지 않고, 코드에 대한 설명을 추가할 수 있답니다. 세 번째 줄에서는 date 명령어를 사용하여 현재 날짜와 시간을 가져와서 current_time 변수에 저장하고, 마지막 줄에서는 echo 명령어를 사용하여 변수 값을 출력하고 있어요. 정말 간단하죠?

주석

Bash 스크립트는 주석을 적극적으로 활용하는 것이 좋아요. 마치 소설책에 페이지 번호를 매기듯, 코드의 각 부분이 어떤 역할을 하는지 명확하게 설명해주는 것이죠. 주석은 #으로 시작하며, 한 줄 전체를 주석 처리할 수도 있고, 명령어 뒤에 간단한 설명을 추가할 수도 있어요. 코드를 이해하고 유지 보수하는 데 큰 도움이 된답니다!

함수

Bash 스크립트는 함수를 사용하여 코드를 모듈화할 수도 있습니다. 함수는 특정 작업을 수행하는 코드 블록으로, 마치 레고 블록처럼 필요할 때마다 호출하여 사용할 수 있죠! 함수를 사용하면 코드의 재사용성을 높이고, 가독성을 향상시킬 수 있습니다.

#!/bin/bash

# 인사말 출력 함수
greet() {
  name=$1
  echo "Hello, $name!"
}

# 함수 호출
greet "Alice"
greet "Bob"

greet() 함수는 입력받은 이름을 사용하여 인사말을 출력하는 함수입니다. $1은 함수에 전달된 첫 번째 인자를 나타내요. 이처럼 함수를 사용하면 같은 작업을 반복해서 작성할 필요 없이, 함수를 호출하여 간편하게 처리할 수 있답니다!

스크립트 실행

Bash 스크립트는 텍스트 파일로 저장되며, .sh 확장자를 갖는 것이 일반적이에요. 스크립트를 실행하려면 터미널에서 bash script.sh 또는 ./script.sh와 같이 실행 권한을 부여한 후 실행할 수 있답니다.

결론

Bash 스크립트는 강력하고 유연한 도구이며, 시스템 관리, 자동화 작업, 웹 개발 등 다양한 분야에서 활용될 수 있어요. 기본 구조를 잘 이해하고, 다양한 기능들을 익히면 여러분의 작업 효율을 크게 높일 수 있을 거예요! 다음에는 변수와 연산자 활용에 대해 자세히 알아보도록 하겠습니다. 기대해주세요!

 

변수와 연산자 활용하기

변수

Bash 스크립트에서 변수는 데이터를 저장하는 이름표 같은 존재예요. 마치 냉장고에 “우유”라고 이름표를 붙여놓으면 그 안에 우유가 들어있는 것처럼요! 이름을 정하고 그 안에 원하는 값을 넣어두면 언제든지 그 이름으로 값을 불러와 사용할 수 있답니다. 참 편리하죠?

변수를 사용하는 방법은 아주 간단해요. 변수 이름을 정하고, 등호(=)를 사용해서 값을 할당하면 돼요. 예를 들어, name="Alice"라고 쓰면 name이라는 변수에 “Alice”라는 문자열 값이 저장되는 거죠! 변수 이름은 영문자, 숫자, 밑줄(_)을 사용할 수 있지만, 숫자로 시작할 수는 없어요. 이 점 꼭 기억해두세요.

변수의 값을 사용할 때는 변수 이름 앞에 달러($) 표시를 붙여주면 돼요. 예를 들어, echo $name이라고 입력하면 “Alice”가 출력된답니다. 어때요? 참 쉽죠?!

연산자

자, 그럼 이제 연산자에 대해 알아볼까요? 연산자는 변수나 값들을 가지고 계산을 할 수 있게 해주는 도구예요. 마치 요리할 때 칼, 도마, 냄비를 사용하는 것처럼 스크립트에서 연산자를 사용해서 여러 가지 작업을 할 수 있죠.

Bash 스크립트에서는 산술 연산자, 비교 연산자, 논리 연산자, 문자열 연산자 등 다양한 연산자들을 제공해요. 각 연산자는 특정한 기능을 수행하며, 스크립트의 기능을 더욱 풍부하게 만들어준답니다!

산술 연산자

산술 연산자는 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/), 나머지(%) 등의 기본적인 연산을 수행할 수 있어요. 예를 들어, result=$((10 + 20))이라고 하면 result 변수에는 30이 저장된답니다. 스크립트 내에서 계산을 해야 할 때 정말 유용하겠죠?

비교 연산자

비교 연산자는 두 값을 비교하는 데 사용돼요. 같다(=), 같지 않다(!=), 크다(>), 작다(<), 크거나 같다(>=), 작거나 같다(<=) 등의 연산자들이 있어요. 비교 연산의 결과는 참(true) 또는 거짓(false)으로 나타나요. 조건문과 함께 사용하면 특정 조건에 따라 다른 작업을 수행하도록 만들 수 있죠! 예를 들어, if [ $a -gt $b ]; then echo “a가 b보다 크다”; fi 와 같이 사용할 수 있답니다. $a가 $b보다 크다면 “a가 b보다 크다”라는 문장이 출력될 거예요.

논리 연산자

논리 연산자는 AND(&&), OR(||), NOT(!) 연산을 수행해요. AND 연산은 두 조건이 모두 참일 때만 참을 반환하고, OR 연산은 두 조건 중 하나라도 참이면 참을 반환해요. NOT 연산은 조건의 참과 거짓을 뒤집는 역할을 한답니다. 여러 조건을 조합해서 복잡한 조건문을 만들 때 아주 유용해요! 예를 들어, if [ $age -ge 18 ] && [ $country == "Korea" ]; then echo "투표 가능"; fi 와 같이 사용하면 $age가 18 이상이고 $country가 “Korea”일 때만 “투표 가능”이라는 문장이 출력될 거예요.

문자열 연산자

문자열 연산자는 문자열을 다루는 데 사용돼요. 문자열 연결(+), 문자열 길이(#), 부분 문자열 추출(:), 문자열 치환(//) 등 다양한 연산을 수행할 수 있답니다. 문자열을 다루는 스크립트를 작성할 때 아주 유용해요! 예를 들어, greeting="Hello, "$name"!" 와 같이 사용하면 greeting 변수에는 “Hello, Alice!”와 같이 name 변수의 값이 포함된 문자열이 저장될 거예요.

다양한 연산자와 활용

Bash 스크립트에서는 이 외에도 다양한 연산자들이 제공돼요. expr, let, bc 등의 명령어를 사용하면 더욱 복잡한 계산도 가능하답니다! 스크립트를 작성하면서 필요에 따라 적절한 연산자를 활용하면 스크립트의 기능을 더욱 강력하게 만들 수 있을 거예요! 다양한 연산자들을 활용해서 멋진 스크립트를 만들어보세요!

이렇게 변수와 연산자를 잘 활용하면 Bash 스크립트로 정말 많은 일들을 할 수 있어요! 마치 레고 블록을 조립하듯이 변수와 연산자를 조합해서 원하는 기능을 가진 스크립트를 만들어낼 수 있죠. 처음에는 조금 어렵게 느껴질 수도 있지만, 꾸준히 연습하다 보면 어느새 능숙하게 스크립트를 작성하는 자신을 발견하게 될 거예요!

 

조건문과 반복문으로 제어 흐름 만들기

Bash 스크립트가 단순한 명령어 나열에서 벗어나 진정한 힘을 발휘하는 순간은 바로 제어 흐름을 다룰 때입니다! 마치 요리 레시피처럼, 단계별로 따라가는 것만으론 특별한 맛을 내기 어렵잖아요? 적절한 타이밍에 양념을 더하고, 불 조절을 하는 것처럼, 스크립트도 조건문과 반복문을 통해 흐름을 제어해야 비로소 원하는 결과를 얻을 수 있어요. 자, 이제 흥미진진한 제어 흐름의 세계로 함께 떠나볼까요~?

스크립트가 복잡해질수록, 단순히 위에서 아래로 순차적으로 명령을 실행하는 것만으로는 우리가 원하는 결과를 얻기 어려워져요. 예를 들어 특정 조건을 만족하는 경우에만 특정 작업을 수행하거나, 혹은 같은 작업을 여러 번 반복해야 할 때가 있죠. 이때 필요한 것이 바로 조건문과 반복문입니다! 이 두 가지 강력한 도구는 스크립트에 논리적 흐름을 부여하여, 마치 살아 숨 쉬는 프로그램처럼 만들어줍니다.

조건문: 상황에 따라 다른 길을 선택하기

먼저 조건문에 대해 알아볼게요. 조건문은 말 그대로 특정 조건이 참인지 거짓인지에 따라 실행할 코드 블록을 결정하는 구문입니다. Bash 스크립트에서는 if, elif, else 키워드를 사용하여 조건문을 구성해요. 마치 RPG 게임에서 갈림길을 만났을 때, 선택에 따라 다른 스토리가 펼쳐지는 것과 같죠!

if 문은 가장 기본적인 조건문으로, 조건이 참이면 해당 코드 블록을 실행하고, 거짓이면 건너뜁니다. if 다음에 [ 조건 ] 형태로 조건식을 작성하고, then 키워드 이후에 실행할 명령어들을 나열하는 구조입니다. -eq (같다), -ne (같지 않다), -gt (크다), -lt (작다), -ge (크거나 같다), -le (작거나 같다) 와 같은 비교 연산자들을 이용하여 숫자 비교를 할 수 있고, -z (문자열이 비어있다면), -n (문자열이 비어있지 않다면) 등 문자열 비교 연산자도 사용할 수 있어요. 파일 관련해서는 -f (파일이 존재하고 일반 파일이면), -d (파일이 존재하고 디렉토리면) 등 다양한 연산자가 존재하죠! 이처럼 조건문을 잘 활용하면 스크립트가 훨씬 유연하고 지능적으로 동작하도록 만들 수 있답니다.

예를 들어, 사용자로부터 입력받은 숫자가 10보다 큰지 확인하는 스크립트를 작성한다고 생각해 보세요. 이럴 때 if [ $number -gt 10 ]; then echo "입력한 숫자는 10보다 큽니다!"; fi 와 같은 스크립트를 작성할 수 있습니다.

반복문: 같은 작업을 효율적으로 반복하기

반복문은 특정 코드 블록을 여러 번 실행해야 할 때 사용합니다. Bash 스크립트에서는 forwhile 루프가 주로 사용되죠. 마치 게임에서 특정 아이템을 얻기 위해 같은 몬스터를 여러 번 사냥하는 것과 비슷해요! 물론, 매번 직접 클릭하는 대신, 반복문을 사용하면 훨씬 효율적으로 작업을 수행할 수 있겠죠?

for 루프는 리스트에 있는 각 항목에 대해 순차적으로 코드 블록을 실행합니다. for 변수 in 리스트; do 명령어들; done 구조로 사용하며, 리스트에는 숫자, 문자열, 파일 이름 등 다양한 값이 올 수 있답니다. 예를 들어 1부터 10까지의 숫자를 출력하는 스크립트를 작성하려면, for i in {1..10}; do echo $i; done 처럼 간단하게 작성할 수 있어요! seq 명령어를 사용하면 더욱 복잡한 수열도 생성할 수 있죠. 숫자 범위와 증감량을 지정하여, for i in $(seq 1 2 10); do echo $i; done 처럼 사용하면 1부터 10까지 2씩 증가하는 숫자를 출력할 수 있답니다.

while 루프는 조건이 참인 동안 계속해서 코드 블록을 실행합니다. while [ 조건 ]; do 명령어들; done 구조를 사용하죠. 조건이 거짓이 되면 루프가 종료됩니다. 예를 들어 특정 파일의 크기가 1MB보다 작을 동안 계속해서 데이터를 추가하는 스크립트를 작성할 수 있어요. 이때 stat -c%s filename 명령어를 사용하여 파일 크기를 확인할 수 있겠죠?

제어 흐름으로 스크립트에 생명 불어넣기

조건문과 반복문을 함께 사용하면 스크립트의 기능을 더욱 확장할 수 있습니다. 예를 들어, 특정 디렉토리에 있는 모든 파일을 검사하여, 파일 크기가 10KB보다 큰 파일만 삭제하는 스크립트를 생각해 보세요. find 명령어를 사용하여 파일을 검색하고, stat 명령어로 파일 크기를 확인한 후, if 문과 -size 옵션을 사용하여 조건에 맞는 파일만 rm 명령어로 삭제할 수 있겠죠? 이처럼 조건문과 반복문은 스크립트의 흐름을 제어하는 강력한 도구입니다. 이들을 잘 활용하면 스크립트를 더욱 효율적이고 유연하게 만들 수 있답니다! 복잡한 작업을 자동화하고, 시스템 관리를 효율적으로 수행하는 데 필수적인 요소이니, 꼭 마스터해보세요! 더 나아가, breakcontinue 명령어를 활용하여 루프의 실행 흐름을 변경할 수도 있다는 점, 잊지 마세요! case 문을 사용하여 여러 조건을 효율적으로 처리하는 방법도 익혀두면 더욱 좋겠죠? 다양한 예제를 통해 연습하고 자신만의 스크립트를 만들어보면서 Bash 스크립트의 매력에 푹 빠져보세요!

 

실전 예제로 스크립트 작성 연습

자, 이제 드디어 실전 예제를 통해 배운 내용을 활용해 볼 시간이에요! 두근두근하지 않나요? ^^ 지금까지 변수, 연산자, 조건문, 반복문… 정말 많은 걸 배웠잖아요? 이 모든 것을 실제 스크립트에 적용하면 얼마나 강력해지는지 직접 경험해 보도록 해요!

1. 로그 파일 분석 스크립트 (access_log_analyzer.sh)

웹 서버의 액세스 로그를 분석해서 특정 IP의 접속 횟수를 세는 스크립트를 만들어 볼게요. 실제 운영 환경에서도 굉장히 유용하게 쓰이는 기능이랍니다! 자, 시작해 볼까요?

#!/bin/bash

# 분석할 로그 파일 경로와 대상 IP 주소
LOG_FILE="/var/log/apache2/access.log"
TARGET_IP="192.168.1.100"

# awk를 사용하여 IP별 접속 횟수 계산
COUNT=$(awk -v ip="$TARGET_IP" '$1 == ip {count++} END {print count}' "$LOG_FILE")

# 결과 출력 ( 없으면 0으로 표시)
echo "IP $TARGET_IP의 접속 횟수: ${COUNT:-0}" 

이 스크립트는 awk라는 강력한 텍스트 처리 도구를 활용했어요. awk는 한 줄씩 파일을 읽으면서, 첫 번째 필드($1)가 TARGET_IP와 일치하는 경우 count 변수를 증가시킨답니다. END 블록에서는 최종 count 값을 출력하고, ${COUNT:-0}는 만약 COUNT 변수가 비어있으면 0을 출력하게 해주는 센스있는 부분이에요! 로그 파일 분석, 생각보다 간단하죠?

2. 파일 백업 스크립트 (backup_files.sh)

중요한 파일들을 정기적으로 백업하는 스크립트는 시스템 관리자의 필수품이라고 할 수 있죠! tar 명령어를 사용해서 특정 디렉토리를 압축하고, 날짜를 포함한 파일 이름으로 저장하는 스크립트를 만들어 볼게요.

#!/bin/bash

# 백업할 디렉토리와 백업 파일 저장 경로
BACKUP_DIR="/home/user/documents"
BACKUP_DEST="/backup"

# 현재 날짜를 YYYYMMDD 형식으로 가져오기
DATE=$(date +%Y%m%d)

# tar 명령어를 사용하여 압축 및 백업
tar -czvf "$BACKUP_DEST/backup_$DATE.tar.gz" "$BACKUP_DIR"

# 백업 완료 메시지 출력 (파일 크기 정보 포함!)
if [[ $? -eq 0 ]]; then
    BACKUP_SIZE=$(du -sh "$BACKUP_DEST/backup_$DATE.tar.gz" | awk '{print $1}')
    echo "백업 완료! 파일 크기: $BACKUP_SIZE"
else
    echo "백업 실패!?!?!  다시 확인해 보세요~?!!" >&2  # 에러 메시지는 표준 에러 출력으로!
fi

date +%Y%m%d 명령어로 현재 날짜를 가져와서 파일 이름에 포함시켰어요. 덕분에 매일 다른 이름으로 백업 파일이 생성되겠죠? tar -czvf 옵션은 파일을 압축하고, 자세한 정보를 출력하며, 파일 이름을 지정해주는 역할을 한답니다. $?는 이전 명령어의 종료 상태를 나타내는데, 0이면 성공, 0이 아니면 실패를 의미해요. 백업 결과에 따라 성공/실패 메시지를 출력하도록 했는데, 실패 메시지는 >&2를 사용해서 표준 에러 출력으로 보내는 것도 잊지 않았어요!

3. 시스템 모니터링 스크립트 (system_monitor.sh)

CPU 사용률, 메모리 사용량, 디스크 용량 등 시스템의 상태를 주기적으로 체크하고, 특정 임계값을 초과하면 알람을 보내는 스크립트는 어떨까요? 물론 여기서는 간단하게 CPU 사용률만 확인하는 예제를 보여드릴게요. (더 복잡한 기능은 여러분의 숙제~?! ^^)

#!/bin/bash

# CPU 사용률 임계값 설정 (80%)
CPU_THRESHOLD=80

# CPU 사용률 확인 (1초 간격으로 5번 측정)
for i in {1..5}; do
    CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
    echo "현재 CPU 사용률: $CPU_USAGE%"

    # 임계값 초과 시 알람 메시지 출력
    if (( $(echo "$CPU_USAGE > $CPU_THRESHOLD" | bc -l) )); then
        echo "CPU 사용률 경고!!! ($CPU_USAGE% > $CPU_THRESHOLD%)"
        # 여기에 알람 전송 명령어 추가 (예: 메일, Slack 메시지 등)
        break  # 임계값 초과 시 루프 종료
    fi

    sleep 1
done

top 명령어로 CPU 사용률을 가져오고, sedawk를 사용해서 원하는 값만 추출하는 부분이 조금 복잡해 보일 수도 있지만, 차근차근 살펴보면 이해할 수 있을 거예요! bc -l 명령어는 부동소수점 연산을 가능하게 해준답니다. 임계값을 초과하면 알람 메시지를 출력하고 루프를 종료하도록 했는데, 실제 운영 환경에서는 메일이나 Slack 메시지 등으로 알람을 전송하도록 수정하면 더욱 유용하겠죠?

이 외에도 무궁무진한 활용 예제들이 있지만, 일단 여기까지만 소개할게요! 직접 스크립트를 작성하고 실행하면서 Bash 스크립트의 매력에 푹 빠져보세요~ ^^ 다음 포스팅에서는 더욱 고급진 스크립트 작성 기법들을 알려드릴 테니 기대해 주세요!

 

자, 이렇게 Bash 스크립트의 기본 구조부터 실전 예제까지 쭉 훑어봤어요! 어때요, 이제 좀 Bash 스크립트가 친근하게 느껴지나요? 처음엔 복잡해 보였을 수도 있지만, 하나씩 차근차근 따라 해보면 생각보다 재밌는 친구라는 걸 알게 될 거예요. 마치 새로운 언어를 배우는 것처럼 말이죠. 변수, 연산자, 조건문, 반복문! 이 친구들만 잘 활용하면 원하는 기능을 가진 스크립트를 뚝딱 만들 수 있답니다. 직접 코드를 작성하고 실행해보면서 여러분만의 스크립트를 만들어 보는 건 어떨까요? Bash 스크립트는 여러분의 업무 효율을 높여주는 든든한 지원군이 되어줄 거예요. 다음에 또 다른 흥미로운 주제로 만나요!

 

Leave a Comment