Ubuntu에서 Bash 스크립트 완전 가이드 | 자동화·작업 관리 최적화

1. Bash의 기본

Bash 셸이란

B(Bourne Again Shell)는 Linux 배포판에서 가장 일반적으로 사용되는 명령줄 인터페이스입니다. 단순하고 강력한 이 도구는 사용자가 시스템과 상 작용할 수 있는 플랫폼을 제공하며, 파일 조작, 프로그램 실행, 작업 관리 등 많은 기본 작업을 수행할 수 있습니다.

Bash의 장점

  • 강력한 스크립트 능력:Bash는 스크립트를 사용하여 복잡한 작업을 자동화할 수 있습니다。
  • 광범위한 지원:대부분의 Unix 계열 운영 체제와 Linux 배포판에서 지원됩니다。
  • 높은 커스터마이칭과 셸 함수에 의해 사용자는 자신의 작업 스타일에 맞게 환경을 맞춤 설정할 수 있습니다。
# 간단한 Bash 명령 예시
echo "안녕, 세계!"

2. Bash 기본 명령어

파일 작업

Bash에서 가장 자주 사용되는 파일 작업 명령어를 소개합니다。
  • ls:디렉터리 내용을 리스트로 표시합니다。
  • cd:디렉터리를 변경합니다。
  • cp:파일 및 디렉터리를 복사합니다。
  • mv:파일을 이동하거나 이름을 변경합니다。
  • rm:파일을 삭제합니다。
# 디렉터리 내용을 상세히 표시
ls -l

# 홈 디렉터리로 이동
cd ~

# 파일을 복사
cp source.txt destination.txt

# 파일을 이동
mv old_name.txt new_name.txt

# 파일을 삭제
rm unwanted_file.txt

시스템 정보 및 프로세스 관리

시스템 정보를 확인하고 프로세스를 관리하는 명령도 중요합니다。
  • ps:활성 프로세스를 표시합니다。
  • top:프로세스 실시간 리스트와 시스템 개요를 표시합니다。
  • kill:프로세스에 신호를 보내 종료합니다。
# 활성 프로세스를 표시
ps aux

# 시스템 개요와 프로세스 리스트를 표시
top

# 프로세스 ID1234를 종료
kill 1234

3. Bash 스크립트 작성 방법

스크립트 기본 구조

Bash 스크립트는 여러 명령을 포함하는 파일입니다. 스크립트를 만들면 일련의 작업을 자동화하고 실행할 수 있습니다.
#!/bin/bash
# 이 행은 시뱅(shebang)이라고 불리며, 스크립트를 해석하기 위해 사용되는 쉘을 지정합니다.

echo "Hello, World!"  # echo 명령으로 문자열을 출력

변수 사용

변수를 사용하여 데이터를 저장하고, 스크립트 내에서 재사용할 수 있습니다.
#!/bin/bash
message="Hello, Bash Scripting!"
echo $message

조건 분기와 루프

복잡한 로직과 작업 반복을 처리하기 위해 조건 분기와 루프를 사용합니다.
#!/bin/bash
# if 문 예시
if [ $1 -gt 100 ]
then
  echo "The number is greater than 100."
else
  echo "The number is 100."
fi

# for 루프 예시
for i in 1 3 4 5
do
  echo "Looping ... number $i"
done

4. Bash를 사용한 작업 자동화

작업 자동화 개요

Bash 스크립트를 사용하면 정기적인 작업을 효율적으로 자동화할 수 있습니다. 시스템 백업, 데이터 동기화, 보고서 생성 등 다양한 프로세스를 자동화하여 시스템 관리의 수고를 줄입니다.

자동 백업 스크립트

일일 데이터 보호를 위해, 아래 스크립트는 지정된 디렉터리를 정기적으로 백업합니다.
#!/bin/bash
SRC_DIR="/home/user/documents"
DST_DIR="/backup/documents"
DATE=$(date +%Y%m%d)

# 백업 디렉터리가 존재하지 않을 경우 생성
if [ ! -d "$DST_DIR" ]; then
  mkdir -p "$DST_DIR"
fi

# 디렉터리 내용을 압축하여 백업
tar -czf "$DST_DIR/backup_$DATE.tar.gz" -C "$SRC_DIR" .
echo "Backup completed successfully."

cron 작업에 의한 스크립트 자동 실행

cron을 사용하여, 위의 백업 스크립트를 매일 오전 2시에 실행하도록 설정합니다.
0 2 * * * /path/to/backup.sh

오류 처리와 알림

백업 처리 중 오류가 발생한 경우에 대한 처리를 추가하고, 문제가 발생하면 관리자에게 알림합니다.
#!/bin/bash
SRC_DIR="/home/user/documents"
DST_DIR="/backup/documents"
LOG_FILE="/var/log/backup.log"
DATE=$(date +%Y%m%d)

if [ ! -d "$DST_DIR" ]; then
  mkdir -p "$DST_DIR"
fi

if tar -czf "$DST_DIR/backup_$DATE.tar.gz" -C "$SRC_DIR" .; then
  echo "Backup successful on $DATE" >> $LOG_FILE
else
  echo "Backup failed on $DATE" | mail -s "Backup Failure" admin@example.com
fi

5. 트러블슈팅 및 자주 발생하는 오류

Bash 오류 이해 및 대처

Bash 스크립트를 실행하는 중에 오류가 발생하는 것은 일반적입니다. 여기서는 자주 발생하는 오류와 그 대처 방법에 대해 설명합니다.

명령을 찾을 수 없는 오류

실행하려는 명령이 시스템에 설치되지 않았거나, 경로가 올바르게 설정되지 않은 경우에 발생합니다.
command not found
  • 대처법: 명령이 설치되어 있는지 확인하고, $PATH 환경 변수가 올바르게 설정되어 있는지 확인합니다.

권한 오류

파일이나 디렉터리에 대한 접근 권한이 부족한 경우에 발생합니다.
Permission denied
  • 대처법: 필요한 권한을 가진 사용자로 작업을 수행하거나, chmodchown 명령으로 권한을 변경합니다.

구문 오류

스크립트 내 코드가 올바르지 않은 형식으로 작성된 경우에 발생합니다.
syntax error: unexpected end of file
  • 대처법: 스크립트를 꼼꼼히 검토하고 구문 오류를 수정합니다.

파일을 찾을 수 없는 오류

지정한 파일이 존재하지 않을 경우에 발생합니다.
No such file or directory
  • 대처법: 파일 경로가 올바른지 확인하고, 파일이 존재하는지 확인합니다.

디버그 도구 사용

Bash 스크립트 디버깅에는 set -x를 사용하면 효과적입니다. 이를 통해 스크립트의 각 단계가 실행 시 표시되어 오류 원인을 파악하기 쉬워집니다.
set -x  # 스크립트 디버깅을 활성화

6. Bash를 사용한 작업 자동화

작업 자동화 개요

Bash 스크립트를 사용하면 정기적인 작업을 효율적으로 자동화할 수 있습니다. 시스템 백업, 데이터 동기화, 보고서 생성 등 다양한 프로세스를 자동화하여 시스템 관리의 수고를 줄입니다.

자동 백업 스크립트

일일 데이터 보호를 위해, 아래 스크립트는 지정된 디렉터리를 정기적으로 백업합니다.
#!/bin/bash
SRC_DIR="/home/user/documents"
DST_DIR="/backup/documents"
DATE=$(date +%Y%m%d)

# 백업 디렉터리가 존재하지 않을 경우 생성
if [ ! -d "$DST_DIR" ]; then
  mkdir -p "$DST_DIR"
fi

# 디렉터리 내용을 압축하여 백업
tar -czf "$DST_DIR/backup_$DATE.tar.gz" -C "$SRC_DIR" .
echo "백업이 성공적으로 완료되었습니다."

cron 작업을 통한 스크립트 자동 실행

cron을 사용하여, 위의 백업 스크립트를 매일 오전 2시에 실행하도록 설정합니다.
0 2 * * * /path/to/backup.sh

오류 처리 및 알림

백업 처리 중 오류가 발생한 경우에 대한 처리를 추가하고, 문제가 발생하면 관리자에게 알립니다.
#!/bin/bash
SRC_DIR="/home/user/documents"
DST_DIR="/backup/documents"
LOG_FILE="/var/log/backup.log"
DATE=$(date +%Y%m%d)

if [ ! -d "$DST_DIR" ]; then
  mkdir -p "$DST_DIR"
fi

if tar -czf "$DST_DIR/backup_$DATE.tar.gz" -C "$SRC_DIR" .; then
  echo "백업이 $DATE에 성공했습니다" >> $LOG_FILE
else
  echo "백업이 $DATE에 실패했습니다" | mail -s "백업 실패" admin@example.com
fi
侍エンジニア塾