Bash 스크립트에서 바인딩되지 않은 변수 문제 해결 방법

ShellBeginner
지금 연습하기

소개

Bash 스크립트에서 바인딩되지 않은 변수는 예상치 못한 동작과 오류를 유발할 수 있습니다. 이 튜토리얼에서는 셸 변수의 기본 사항을 살펴보고, 변수가 바인딩되지 않은 (설정되지 않은) 경우를 식별하는 방법을 배우며, 이를 처리하기 위한 효과적인 전략을 구현할 것입니다. 이 랩을 마치면 변수 문제를 우아하게 처리하는 더욱 신뢰할 수 있는 Bash 스크립트를 작성할 수 있습니다.

셸 변수를 사용하여 첫 번째 스크립트 만들기

셸 변수는 Bash 스크립트에서 값을 저장하는 명명된 저장 위치입니다. 이 단계에서는 변수가 어떻게 작동하는지 이해하고 어떻게 사용되는지 확인하기 위해 간단한 스크립트를 만들 것입니다.

셸 변수 이해

Bash 의 변수를 사용하면 스크립트 전체에서 참조하고 조작할 수 있는 데이터를 저장할 수 있습니다. 이는 유연하고 재사용 가능한 스크립트를 작성하는 데 필수적입니다.

프로젝트 디렉토리에 새 스크립트 파일을 만들어 보겠습니다.

  1. WebIDE 를 열고 /home/labex/project 디렉토리에 variables.sh라는 새 파일을 만듭니다.

  2. 파일에 다음 내용을 추가합니다.

#!/bin/bash

## Declaring variables
name="LabEx User"
age=25
current_date=$(date)

## Accessing variables
echo "Hello, my name is $name"
echo "I am $age years old"
echo "Today is: $current_date"

## Variables with spaces need quotes
greeting="Welcome to Bash scripting"
echo "$greeting"
  1. 파일을 저장합니다.

  2. 터미널에서 다음 명령을 실행하여 스크립트를 실행 가능하게 만듭니다.

chmod +x variables.sh
  1. 스크립트를 실행합니다.
./variables.sh

다음과 유사한 출력을 볼 수 있습니다.

Hello, my name is LabEx User
I am 25 years old
Today is: Mon Jan 1 12:34:56 UTC 2023
Welcome to Bash scripting

변수 명명 규칙

Bash 에서 변수 이름을 지정할 때 다음 규칙을 염두에 두십시오.

  • 변수 이름은 문자, 숫자 및 밑줄을 포함할 수 있습니다.
  • 변수 이름은 숫자로 시작할 수 없습니다.
  • 값을 할당할 때 등호 주위에 공백을 사용할 수 없습니다.
  • 변수 이름은 대소문자를 구분합니다 (NAME 과 name 은 서로 다른 변수입니다).

스크립트에 몇 가지 더 많은 예제를 추가해 보겠습니다. variables.sh를 다시 열고 다음을 끝에 추가합니다.

## Examples of valid variable names
user_1="John"
HOME_DIR="/home/user"
count=42

## Printing the variables
echo "User: $user_1"
echo "Home directory: $HOME_DIR"
echo "Count: $count"

파일을 저장하고 다시 실행합니다.

./variables.sh

추가 출력은 다음과 같아야 합니다.

User: John
Home directory: /home/user
Count: 42

이제 변수를 올바르게 사용하는 첫 번째 Bash 스크립트를 만들었습니다!

바인딩되지 않은 변수 발생

이제 변수의 기본 사항을 이해했으므로, 값을 할당받지 않은 변수, 즉 바인딩되지 않은 변수를 사용하려고 할 때 어떤 일이 발생하는지 살펴보겠습니다.

바인딩되지 않은 변수란 무엇인가요?

바인딩되지 않은 변수는 스크립트에서 값이 할당되지 않은 변수이며, 설정되지 않은 변수라고도 합니다. 바인딩되지 않은 변수를 사용하려고 하면 Bash 는 일반적으로 이를 빈 문자열로 처리하며, 이는 스크립트에서 미묘한 버그를 유발할 수 있습니다.

이를 실제로 확인하기 위해 새 스크립트를 만들어 보겠습니다.

  1. 프로젝트 디렉토리에 다음 내용으로 unbound.sh라는 새 파일을 만듭니다.
#!/bin/bash

## A variable that is properly set
username="labex"

## Try to use a variable that hasn't been set
echo "Hello, $username! Your home directory is $home_dir"

## Try to do math with an unbound variable
total=$((count + 5))
echo "Total: $total"
  1. 스크립트를 실행 가능하게 만듭니다.
chmod +x unbound.sh
  1. 스크립트를 실행합니다.
./unbound.sh

다음과 유사한 출력을 볼 수 있습니다.

Hello, labex! Your home directory is

Total: 5

$home_dir가 빈 공간으로 표시되고 $count가 계산에서 0 으로 처리되는 것을 확인하세요. 이러한 조용한 동작은 찾기 어려운 버그로 이어질 수 있습니다.

바인딩되지 않은 변수 감지

이러한 바인딩되지 않은 변수를 감지하는 데 도움이 되도록 스크립트를 수정해 보겠습니다. 이를 수행하는 한 가지 방법은 변수를 사용하기 전에 조건부 검사를 사용하는 것입니다.

  1. unbound.sh를 열고 내용을 다음으로 바꿉니다.
#!/bin/bash

## A variable that is properly set
username="labex"

## Check if home_dir is set before using it
if [ -z "$home_dir" ]; then
  echo "Warning: home_dir is not set!"
  home_dir="/home/default"
  echo "Using default: $home_dir"
else
  echo "Home directory is: $home_dir"
fi

## Check if count is set before doing math
if [ -z "$count" ]; then
  echo "Warning: count is not set!"
  count=10
  echo "Using default count: $count"
fi

total=$((count + 5))
echo "Total: $total"
  1. 파일을 저장하고 다시 실행합니다.
./unbound.sh

이제 출력은 다음과 같아야 합니다.

Warning: home_dir is not set!
Using default: /home/default
Warning: count is not set!
Using default count: 10
Total: 15

이 접근 방식은 바인딩되지 않은 변수를 포착하고 조용한 오류를 발생시키는 대신 명시적으로 처리하는 데 도움이 됩니다.

set -u 옵션으로 테스트

바인딩되지 않은 변수를 감지하는 또 다른 방법은 바인딩되지 않은 변수를 만나면 Bash 가 즉시 종료되도록 하는 set -u 옵션을 사용하는 것입니다.

  1. 다음 내용으로 strict.sh라는 새 파일을 만듭니다.
#!/bin/bash
set -u ## Exit when unbound variable is used

echo "My username is $username"
echo "My favorite color is $favorite_color"
echo "This line won't be reached if favorite_color isn't set"
  1. 실행 가능하게 만듭니다.
chmod +x strict.sh
  1. 스크립트를 실행합니다.
./strict.sh

다음과 유사한 오류 메시지를 볼 수 있습니다.

./strict.sh: line 4: favorite_color: unbound variable

스크립트는 바인딩되지 않은 변수 $favorite_color를 사용하려고 할 때 4 행에서 즉시 종료됩니다. 이는 바인딩되지 않은 변수를 조기에 포착하여 스크립트의 나중에 발생할 수 있는 문제를 방지하는 데 도움이 됩니다.

매개변수 확장을 사용하여 바인딩되지 않은 변수 처리

바인딩되지 않은 변수를 처리하기 위한 Bash 의 가장 강력한 기능 중 하나는 매개변수 확장입니다. 이를 통해 기본값을 제공하고 변수에 대해 다양한 작업을 수행할 수 있습니다.

매개변수 확장을 사용하여 기본값 사용

매개변수 확장은 바인딩되지 않은 변수를 우아하게 처리하는 여러 가지 방법을 제공합니다. 이러한 기술을 시연하기 위해 새 스크립트를 만들어 보겠습니다.

  1. 다음 내용으로 parameter_expansion.sh라는 새 파일을 만듭니다.
#!/bin/bash

## Default value with ${parameter:-default}
## If parameter is unset or null, 'default' is used
echo "1. Username: ${username:-anonymous}"

## Define username and try again
username="labex"
echo "2. Username: ${username:-anonymous}"

## Default value with ${parameter-default}
## Only if parameter is unset, 'default' is used
unset username
empty_var=""
echo "3. Username (unset): ${username-anonymous}"
echo "4. Empty variable: ${empty_var-not empty}"

## Assign default with ${parameter:=default}
## If parameter is unset or null, set it to 'default'
echo "5. Language: ${language:=bash}"
echo "6. Language is now set to: $language"

## Display error with ${parameter:?message}
## If parameter is unset or null, show error message and exit
echo "7. About to check required parameter..."
## Uncomment the line below to see the error
## echo "Config file: ${config_file:?not specified}"

echo "8. Script continues..."
  1. 스크립트를 실행 가능하게 만듭니다.
chmod +x parameter_expansion.sh
  1. 스크립트를 실행합니다.
./parameter_expansion.sh

다음과 같은 출력을 볼 수 있습니다.

1. Username: anonymous
2. Username: labex
3. Username (unset): anonymous
4. Empty variable:
5. Language: bash
6. Language is now set to: bash
7. About to check required parameter...
8. Script continues...

일반적인 매개변수 확장 패턴

다음은 방금 사용한 매개변수 확장 패턴의 요약입니다.

구문 설명
${var:-default} var 가 설정되지 않거나 null 인 경우 기본값 사용
${var-default} var 가 설정되지 않은 경우에만 기본값 사용
${var:=default} var 가 설정되지 않거나 null 인 경우 기본값으로 설정
${var:?message} var 가 설정되지 않거나 null 인 경우 오류 표시

실용적인 예제 만들기

구성 설정을 처리하기 위해 매개변수 확장을 사용하는 더 실용적인 스크립트를 만들어 보겠습니다.

  1. 다음 내용으로 config_script.sh라는 새 파일을 만듭니다.
#!/bin/bash

## Script that processes files with configurable settings

## Use parameter expansion to set defaults for all configuration options
BACKUP_DIR=${BACKUP_DIR:-"/tmp/backups"}
MAX_FILES=${MAX_FILES:-5}
FILE_TYPE=${FILE_TYPE:-"txt"}
VERBOSE=${VERBOSE:-"no"}

echo "Configuration settings:"
echo "----------------------"
echo "Backup directory: $BACKUP_DIR"
echo "Maximum files: $MAX_FILES"
echo "File type: $FILE_TYPE"
echo "Verbose mode: $VERBOSE"

## Create backup directory if it doesn't exist
if [ ! -d "$BACKUP_DIR" ]; then
  echo "Creating backup directory: $BACKUP_DIR"
  mkdir -p "$BACKUP_DIR"
fi

## Search for files of specified type (in current directory for demo)
echo "Searching for .$FILE_TYPE files..."
file_count=$(find . -maxdepth 1 -name "*.$FILE_TYPE" | wc -l)

echo "Found $file_count .$FILE_TYPE files"

## Enable verbose output if requested
if [ "$VERBOSE" = "yes" ]; then
  echo "Files found:"
  find . -maxdepth 1 -name "*.$FILE_TYPE" -type f
fi

echo "Script completed successfully!"
  1. 스크립트를 실행 가능하게 만듭니다.
chmod +x config_script.sh
  1. 기본값을 사용하여 스크립트를 실행합니다.
./config_script.sh
  1. 이제 사용자 지정 설정으로 다시 실행합니다.
FILE_TYPE="sh" VERBOSE="yes" ./config_script.sh

출력은 현재 디렉토리의 bash 스크립트 (.sh 파일) 를 표시해야 합니다.

이 스크립트는 매개변수 확장을 사용하여 구성 변수에 대한 기본값을 설정하는 방법을 보여주며, 스크립트를 유연하고 사용자 친화적으로 만듭니다.

강력한 스크립트를 위한 엄격 모드 사용

더욱 안정적이고 오류에 강한 Bash 스크립트를 만들기 위해 많은 개발자가 "엄격 모드"라고 불리는 것을 사용합니다. 여기에는 바인딩되지 않은 변수를 포함한 일반적인 오류를 포착하는 데 도움이 되는 일련의 Bash 옵션이 포함됩니다.

엄격 모드란 무엇인가요?

엄격 모드는 일반적으로 스크립트 시작 부분에서 다음 옵션을 활성화하는 것을 포함합니다.

  • set -e: 명령이 0 이 아닌 상태로 종료되면 즉시 종료
  • set -u: 바인딩되지 않은 변수가 참조되면 종료
  • set -o pipefail: 파이프라인의 명령 중 하나라도 실패하면 파이프라인이 실패하도록 함

스크립트에서 이를 구현하는 방법을 살펴보겠습니다.

  1. 다음 내용으로 strict_mode.sh라는 새 파일을 만듭니다.
#!/bin/bash
## Strict mode
set -euo pipefail

echo "Starting strict mode script..."

## Define some variables
username="labex"
project_dir="/home/labex/project"

## This function requires two parameters
process_data() {
  local input="$1"
  local output="${2:-output.txt}"

  echo "Processing $input and saving to $output"
  ## For demo purposes, just echo to the output file
  echo "Processed data from $input" > "$output"
}

## Call the function with required arguments
process_data "input.txt"

## Try to access a non-existent file
## Uncomment the next line to see how strict mode handles errors
## cat non_existent_file.txt

echo "Script completed successfully"
  1. 스크립트를 실행 가능하게 만듭니다.
chmod +x strict_mode.sh
  1. 스크립트를 실행합니다.
./strict_mode.sh

다음과 같은 출력을 볼 수 있습니다.

Starting strict mode script...
Processing input.txt and saving to output.txt
Script completed successfully
  1. 출력 파일이 생성되었는지 확인합니다.
cat output.txt

다음과 같은 출력을 볼 수 있습니다.

Processed data from input.txt

엄격 모드에서 오류 처리 테스트

이제 스크립트를 수정하여 엄격 모드가 오류를 처리하는 방식을 살펴보겠습니다.

  1. 다음 내용으로 strict_mode_errors.sh라는 새 파일을 만듭니다.
#!/bin/bash
## Strict mode
set -euo pipefail

echo "Starting script with error demonstrations..."

## Example 1: Unbound variable
echo "Example 1: About to use an unbound variable"
## Uncomment the next line to see the error
## echo "Home directory: $HOME_DIR"
echo "This line will not be reached if you uncomment the above line"

## Example 2: Command failure
echo "Example 2: About to run a failing command"
## Uncomment the next line to see the error
## grep "pattern" non_existent_file.txt
echo "This line will not be reached if you uncomment the above line"

## Example 3: Pipeline failure
echo "Example 3: About to create a failing pipeline"
## Uncomment the next line to see the error
## cat non_existent_file.txt | sort
echo "This line will not be reached if you uncomment the above line"

echo "Script completed without errors"
  1. 스크립트를 실행 가능하게 만듭니다.
chmod +x strict_mode_errors.sh
  1. 스크립트를 실행합니다.
./strict_mode_errors.sh
  1. 이제 스크립트를 편집하여 오류 줄 중 하나 (예: $HOME_DIR가 있는 줄) 의 주석 처리를 해제하고 저장한 다음 다시 실행합니다.
./strict_mode_errors.sh

바인딩되지 않은 변수를 만나면 스크립트가 오류 메시지와 함께 즉시 종료되는 것을 볼 수 있습니다.

Starting script with error demonstrations...
Example 1: About to use an unbound variable
./strict_mode_errors.sh: line 9: HOME_DIR: unbound variable

이는 엄격 모드가 스크립트 초기에 문제를 식별하는 데 어떻게 도움이 되는지 보여줍니다.

강력한 스크립트 템플릿 만들기

향후 프로젝트에 사용할 수 있는 강력한 Bash 스크립트 템플릿을 만들어 보겠습니다.

  1. 다음 내용으로 robust_script_template.sh라는 새 파일을 만듭니다.
#!/bin/bash
## ====================================
## Robust Bash Script Template
## ====================================

## --- Strict mode ---
set -euo pipefail

## --- Script metadata ---
SCRIPT_NAME="$(basename "$0")"
SCRIPT_VERSION="1.0.0"

## --- Default configuration ---
DEBUG=${DEBUG:-false}
LOG_FILE=${LOG_FILE:-"/tmp/${SCRIPT_NAME}.log"}

## --- Helper functions ---
log() {
  local message="$1"
  local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
  echo "[$timestamp] $message" | tee -a "$LOG_FILE"
}

debug() {
  if [[ "$DEBUG" == "true" ]]; then
    log "DEBUG: $1"
  fi
}

error() {
  log "ERROR: $1"
  exit 1
}

usage() {
  cat << EOF
Usage: $SCRIPT_NAME [options]

A robust bash script template with error handling and logging.

Options:
  --help      Show this help message and exit
  --version   Show script version and exit

Environment variables:
  DEBUG       Set to 'true' to enable debug output
  LOG_FILE    Path to the log file (default: /tmp/${SCRIPT_NAME}.log)
EOF
}

## --- Process command line arguments ---
for arg in "$@"; do
  case $arg in
    --help)
      usage
      exit 0
      ;;
    --version)
      echo "$SCRIPT_NAME version $SCRIPT_VERSION"
      exit 0
      ;;
    *)
      ## Unknown option
      ;;
  esac
done

## --- Main script logic ---
main() {
  log "Starting $SCRIPT_NAME version $SCRIPT_VERSION"

  ## Your script logic goes here
  debug "Script executed with DEBUG=$DEBUG"
  log "Script executed by user: $(whoami)"
  log "Current directory: $(pwd)"

  ## Example of using a variable with default value
  TARGET_DIR=${TARGET_DIR:-$(pwd)}
  log "Target directory: $TARGET_DIR"

  log "$SCRIPT_NAME completed successfully"
}

## --- Run main function ---
main
  1. 스크립트를 실행 가능하게 만듭니다.
chmod +x robust_script_template.sh
  1. 스크립트를 실행합니다.
./robust_script_template.sh
  1. 디버깅을 활성화하여 실행해 봅니다.
DEBUG=true ./robust_script_template.sh

이 템플릿에는 다음이 포함됩니다.

  • 오류를 포착하기 위한 엄격 모드 설정
  • 매개변수 확장을 사용한 기본 구성
  • 로깅 및 디버깅 기능
  • 명령줄 인수 처리
  • main 함수가 있는 깔끔한 구조

이 템플릿을 자체 Bash 스크립트의 시작점으로 사용하여 더욱 강력하고 유지 관리 가능하게 만들 수 있습니다.

실제 애플리케이션 만들기

이제 변수, 바인딩되지 않은 변수, 매개변수 확장 및 엄격 모드에 대해 배웠으므로 이러한 모든 개념을 실용적인 스크립트로 결합해 보겠습니다. Bash 에서 변수를 처리하는 모범 사례를 보여주는 간단한 파일 백업 유틸리티를 만들 것입니다.

백업 스크립트 계획

백업 스크립트는 다음과 같습니다.

  1. 소스 디렉토리와 백업 대상을 입력으로 받습니다.
  2. 환경 변수 또는 명령줄 인수를 통해 구성을 허용합니다.
  3. 엄격 모드를 사용하여 오류를 적절하게 처리합니다.
  4. 사용자에게 유용한 피드백을 제공합니다.

백업 스크립트 만들기

  1. 다음 내용으로 backup.sh라는 새 파일을 만듭니다.
#!/bin/bash
## ====================================
## File Backup Utility
## ====================================

## --- Strict mode ---
set -euo pipefail

## --- Script metadata ---
SCRIPT_NAME="$(basename "$0")"
SCRIPT_VERSION="1.0.0"

## --- Default configuration ---
SOURCE_DIR=${SOURCE_DIR:-"$(pwd)"}
BACKUP_DIR=${BACKUP_DIR:-"/tmp/backups"}
BACKUP_NAME=${BACKUP_NAME:-"backup_$(date +%Y%m%d_%H%M%S)"}
EXCLUDE_PATTERN=${EXCLUDE_PATTERN:-"*.tmp"}
VERBOSE=${VERBOSE:-"false"}

## --- Helper functions ---
log() {
  if [[ "$VERBOSE" == "true" ]]; then
    echo "$(date "+%Y-%m-%d %H:%M:%S") - $1"
  fi
}

error() {
  echo "ERROR: $1" >&2
  exit 1
}

usage() {
  cat << EOF
Usage: $SCRIPT_NAME [options]

A simple file backup utility.

Options:
  -s, --source DIR      Source directory to backup (default: current directory)
  -d, --destination DIR Backup destination directory (default: /tmp/backups)
  -n, --name NAME       Name for the backup archive (default: backup_YYYYMMDD_HHMMSS)
  -e, --exclude PATTERN Files to exclude (default: *.tmp)
  -v, --verbose         Enable verbose output
  -h, --help            Show this help message and exit

Environment variables:
  SOURCE_DIR       Same as --source
  BACKUP_DIR       Same as --destination
  BACKUP_NAME      Same as --name
  EXCLUDE_PATTERN  Same as --exclude
  VERBOSE          Set to 'true' to enable verbose output
EOF
}

## --- Process command line arguments ---
while [[ $## -gt 0 ]]; do
  case $1 in
    -s | --source)
      SOURCE_DIR="$2"
      shift 2
      ;;
    -d | --destination)
      BACKUP_DIR="$2"
      shift 2
      ;;
    -n | --name)
      BACKUP_NAME="$2"
      shift 2
      ;;
    -e | --exclude)
      EXCLUDE_PATTERN="$2"
      shift 2
      ;;
    -v | --verbose)
      VERBOSE="true"
      shift
      ;;
    -h | --help)
      usage
      exit 0
      ;;
    *)
      error "Unknown option: $1"
      ;;
  esac
done

## --- Main function ---
main() {
  ## Validate source directory
  if [[ ! -d "$SOURCE_DIR" ]]; then
    error "Source directory does not exist: $SOURCE_DIR"
  fi

  ## Create backup directory if it doesn't exist
  if [[ ! -d "$BACKUP_DIR" ]]; then
    log "Creating backup directory: $BACKUP_DIR"
    mkdir -p "$BACKUP_DIR" || error "Failed to create backup directory"
  fi

  ## Full path for the backup file
  BACKUP_FILE="$BACKUP_DIR/$BACKUP_NAME.tar.gz"

  log "Starting backup from $SOURCE_DIR to $BACKUP_FILE"
  log "Excluding files matching: $EXCLUDE_PATTERN"

  ## Create the backup
  tar -czf "$BACKUP_FILE" \
    --exclude="$EXCLUDE_PATTERN" \
    -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")" \
    || error "Backup failed"

  ## Check if backup was created
  if [[ -f "$BACKUP_FILE" ]]; then
    BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
    echo "Backup completed successfully: $BACKUP_FILE ($BACKUP_SIZE)"
  else
    error "Backup file was not created"
  fi
}

## --- Run main function ---
main
  1. 스크립트를 실행 가능하게 만듭니다.
chmod +x backup.sh
  1. 기본 설정으로 스크립트를 실행합니다.
./backup.sh

백업이 성공적으로 생성되었음을 확인하는 메시지가 표시됩니다.

  1. 백업 파일을 확인합니다.
ls -lh /tmp/backups/
  1. 다른 옵션으로 스크립트를 실행해 봅니다.
./backup.sh --source ~/project --destination ~/backups --name my_project_backup --verbose

~/backups 디렉토리가 없으면 스크립트가 생성합니다. 해당 디렉토리를 만들 수 있는 쓰기 권한이 없으면 오류가 표시될 수 있습니다.

백업 스크립트에서 오류 처리 테스트

스크립트가 오류를 처리하는 방식을 테스트해 보겠습니다.

  1. 존재하지 않는 디렉토리를 백업하려고 시도합니다.
./backup.sh --source /path/that/does/not/exist

다음과 같은 오류 메시지가 표시됩니다.

ERROR: Source directory does not exist: /path/that/does/not/exist
  1. 유효하지 않은 백업 대상 (쓰기 권한이 없는 곳) 을 설정하려고 시도합니다.
./backup.sh --destination /root/backups

스크립트가 백업 디렉토리를 만드는 데 실패했음을 나타내는 오류 메시지가 표시됩니다.

테스트 환경 만들기

백업 스크립트를 시연하기 위한 테스트 환경을 만들어 보겠습니다.

  1. 테스트 디렉토리 구조를 만듭니다.
mkdir -p ~/project/test_backup/{docs,images,code}
touch ~/project/test_backup/docs/{readme.md,manual.pdf}
touch ~/project/test_backup/images/{logo.png,banner.jpg}
touch ~/project/test_backup/code/{script.sh,data.tmp,config.json}
  1. 이 테스트 디렉토리에서 백업 스크립트를 실행합니다.
./backup.sh --source ~/project/test_backup --exclude "*.tmp" --verbose
  1. 백업의 파일을 나열합니다.
tar -tvf /tmp/backups/backup_*.tar.gz | sort

제외 패턴 (*.tmp) 과 일치하는 파일을 제외한 모든 파일이 표시됩니다.

이 백업 스크립트는 지금까지 다룬 모든 개념을 보여줍니다.

  • 매개변수 확장을 사용하여 변수에 대한 기본값 설정
  • 오류를 포착하기 위해 엄격 모드 사용
  • 명령줄 인수 및 환경 변수 처리
  • 사용자 피드백 및 오류 메시지 제공
  • 입력 유효성 검사 및 예외 처리

이러한 기술을 사용하면 바인딩되지 않은 변수를 적절하게 처리하고 더 나은 사용자 경험을 제공하는 강력한 Bash 스크립트를 작성할 수 있습니다.

요약

이 랩에서는 신뢰할 수 있는 셸 스크립트를 작성하는 데 중요한 기술인 Bash 스크립트에서 바인딩되지 않은 변수를 처리하는 방법을 배웠습니다. 수행한 작업에 대한 요약은 다음과 같습니다.

  1. 적절한 변수 선언 및 사용법이 있는 스크립트 생성
  2. 바인딩되지 않은 변수가 Bash 스크립트에서 발생시킬 수 있는 문제 식별
  3. 조건부 검사를 사용하여 바인딩되지 않은 변수 감지
  4. 기본값을 제공하기 위해 매개변수 확장 기술 적용
  5. 오류를 조기에 포착하기 위해 엄격 모드 (set -euo pipefail) 구현
  6. 적절한 오류 처리가 있는 강력한 스크립트 템플릿 생성
  7. 모범 사례를 보여주는 실용적인 백업 유틸리티 구축

이러한 기술을 적용하면 예외를 적절하게 처리하고 사용자에게 더 나은 경험을 제공하는 더욱 신뢰할 수 있는 Bash 스크립트를 작성할 수 있습니다. 다음 핵심 사항을 기억하십시오.

  • 변수가 설정되지 않은 경우 발생하는 상황을 항상 고려하십시오.
  • 기본값에 매개변수 확장을 사용하십시오.
  • 중요한 스크립트에 대해 엄격 모드를 활성화하십시오.
  • 입력을 검증하고 유용한 오류 메시지를 제공하십시오.
  • 스크립트의 동작 및 요구 사항을 문서화하십시오.

이러한 관행은 더욱 강력하고 유지 관리 가능하며 사용자 친화적인 Bash 스크립트를 만드는 데 도움이 됩니다.