Bash 스크립트에서 기본값 설정 방법

ShellBeginner
지금 연습하기

소개

Bash 스크립트에서 기본값을 설정하는 것은 견고하고 사용자 친화적인 셸 스크립트를 만드는 데 필수적인 기술입니다. 이 튜토리얼에서는 기본값을 제공하여 누락되거나 선택적인 매개변수를 처리하는 과정을 안내하여 스크립트가 다양한 입력 시나리오를 우아하게 처리할 수 있도록 합니다.

이 Lab 을 마치면 사용자가 예상되는 모든 입력 매개변수를 제공하지 않더라도 잘 작동하는 Bash 스크립트를 작성할 수 있게 됩니다.

Bash 에서 기본값 이해하기

Bash 스크립트를 작성할 때, 특정 입력 매개변수가 누락된 경우에도 스크립트가 작동하도록 해야 하는 경우가 많습니다. 기본값은 변수가 명시적으로 설정되지 않은 경우 대체 옵션을 제공하여 솔루션을 제공합니다.

기본값이 중요한 이유

Bash 스크립트의 기본값은 몇 가지 중요한 목적을 수행합니다.

  • 예상되는 입력이 누락된 경우 스크립트가 실패하는 것을 방지합니다.
  • 필요한 매개변수를 줄여 스크립트를 더욱 사용자 친화적으로 만듭니다.
  • 스크립트가 다양한 환경에서 합리적인 동작을 하도록 합니다.
  • 스크립트 개발 및 테스트를 단순화합니다.

간단한 스크립트 만들기

기본값의 필요성을 보여주기 위해 간단한 Bash 스크립트를 만들어 보겠습니다. 다음 단계를 따르세요.

  1. WebIDE 터미널을 엽니다.
  2. 프로젝트를 위한 새 디렉토리를 만듭니다.
mkdir -p ~/project/bash_defaults
cd ~/project/bash_defaults
  1. WebIDE 를 사용하여 bash_defaults 디렉토리에 다음 내용으로 greeting.sh라는 새 파일을 만듭니다.
#!/bin/bash

## A simple greeting script
NAME=$1
echo "Hello, $NAME!"
  1. 스크립트를 실행 가능하게 만듭니다.
chmod +x greeting.sh
  1. 이제 이름 매개변수를 사용하여 스크립트를 실행합니다.
./greeting.sh Alice

다음 출력을 볼 수 있습니다.

Hello, Alice!
  1. 이제 매개변수 없이 스크립트를 실행해 봅니다.
./greeting.sh

다음 출력을 볼 수 있습니다.

Hello, !

이름이 제공되지 않으면 인사가 불완전하게 보입니다. 이것은 기본값이 스크립트를 더욱 강력하게 만드는 데 도움이 되는 완벽한 시나리오입니다.

다음 단계에서는 매개변수가 누락된 경우에도 잘 작동하도록 이 스크립트를 수정하여 기본값을 사용합니다.

기본값 기술

이제 기본값이 중요한 이유를 이해했으므로 Bash 스크립트에서 기본값을 설정하는 다양한 방법을 알아보겠습니다. 가장 일반적인 기술부터 시작합니다.

매개변수 대체 연산자 (:-)

Bash 에서 기본값을 설정하는 가장 일반적인 방법은 다음 구문을 사용하여 :- 연산자를 사용하는 것입니다.

${variable:-default_value}

이것은 "변수가 설정되어 있고 비어 있지 않은 경우 variable의 값을 사용하고, 그렇지 않으면 default_value를 사용하십시오"를 의미합니다.

기본값을 포함하도록 인사말 스크립트를 수정해 보겠습니다.

  1. WebIDE 에서 greeting.sh 파일을 열고 다음 내용으로 업데이트합니다.
#!/bin/bash

## A greeting script with default value
NAME=${1:-"World"}
echo "Hello, $NAME!"
  1. 파일을 저장하고 매개변수를 사용하여 스크립트를 실행합니다.
./greeting.sh Alice

다음 출력을 볼 수 있습니다.

Hello, Alice!
  1. 이제 매개변수 없이 스크립트를 실행합니다.
./greeting.sh

다음 출력을 볼 수 있습니다.

Hello, World!

이제 스크립트는 이름이 제공되지 않으면 "World"를 기본값으로 사용하여 훨씬 더 사용자 친화적입니다.

더 복잡한 스크립트 만들기

사용자를 맞이하는 사용자 정의 메시지와 시간대를 사용하여 더 복잡한 스크립트를 만들어 보겠습니다. 두 매개변수 모두에 기본값을 사용합니다.

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

## A welcome script with multiple default values
NAME=${1:-"User"}
GREETING=${2:-"Welcome"}
TIME_OF_DAY=${3:-"today"}

echo "$GREETING, $NAME! How are you doing $TIME_OF_DAY?"
  1. 스크립트를 실행 가능하게 만듭니다.
chmod +x welcome.sh
  1. 다양한 매개변수 조합으로 스크립트를 실행합니다.
./welcome.sh

출력:

Welcome, User! How are you doing today?
./welcome.sh Bob

출력:

Welcome, Bob! How are you doing today?
./welcome.sh Bob "Good morning"

출력:

Good morning, Bob! How are you doing today?
./welcome.sh Bob "Good morning" "this fine afternoon"

출력:

Good morning, Bob! How are you doing this fine afternoon?

보시다시피 기본값은 스크립트를 훨씬 더 유연하게 만들어 제공된 모든 수의 매개변수와 함께 작동합니다.

환경 변수 및 기본값 사용

많은 Bash 스크립팅 시나리오에서 환경 변수를 사용해야 합니다. 특정 환경 변수가 설정되지 않은 경우에도 스크립트가 작동하도록 하려는 경우 기본값이 특히 유용합니다.

환경 변수의 기본값

환경 변수는 종종 셸 스크립트에서 구성에 사용됩니다. 기본값을 사용하여 환경 변수를 사용하는 스크립트를 만들어 보겠습니다.

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

## Access environment variables with default values
USERNAME=${USER:-"anonymous"}
WORKING_DIR=${PWD:-"/home/labex"}
EDITOR=${VISUAL:-${EDITOR:-"nano"}}

echo "Current user: $USERNAME"
echo "Working directory: $WORKING_DIR"
echo "Preferred editor: $EDITOR"
  1. 스크립트를 실행 가능하게 만듭니다.
chmod +x config.sh
  1. 스크립트를 실행합니다.
./config.sh

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

Current user: labex
Working directory: /home/labex/project/bash_defaults
Preferred editor: nano

EDITOR 변수에 대해 기본값을 중첩한 방식을 확인하세요. 이 스크립트는 먼저 VISUAL 환경 변수가 설정되어 있는지 확인하고, 그렇지 않은 경우 EDITOR 변수를 확인합니다. 둘 다 설정되지 않은 경우 "nano"를 기본값으로 사용합니다.

구성 스크립트 만들기

이제 기본값을 사용하여 환경 변수를 사용하는 애플리케이션을 구성하는 더 실용적인 스크립트를 만들어 보겠습니다.

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

## Application configuration script using default values
APP_NAME=${APP_NAME:-"MyApp"}
APP_VERSION=${APP_VERSION:-"1.0.0"}
APP_PORT=${APP_PORT:-8080}
APP_ENV=${APP_ENV:-"development"}
LOG_LEVEL=${LOG_LEVEL:-"info"}

echo "Starting $APP_NAME v$APP_VERSION"
echo "Configuration:"
echo "  Port: $APP_PORT"
echo "  Environment: $APP_ENV"
echo "  Log Level: $LOG_LEVEL"

## Create a config file with these settings
echo "Creating configuration file..."
cat > app.conf << EOF
APP_NAME=$APP_NAME
APP_VERSION=$APP_VERSION
APP_PORT=$APP_PORT
APP_ENV=$APP_ENV
LOG_LEVEL=$LOG_LEVEL
EOF

echo "Configuration file created at $(pwd)/app.conf"
  1. 스크립트를 실행 가능하게 만듭니다.
chmod +x app_config.sh
  1. 기본값으로 스크립트를 실행합니다.
./app_config.sh

기본 구성에 대한 출력을 볼 수 있습니다.

  1. 이제 일부 환경 변수를 설정하여 실행합니다.
APP_NAME="WebService" APP_PORT=3000 APP_ENV="production" ./app_config.sh

일부 설정에 대해 제공한 값을 사용하고 다른 설정에 대해 기본값을 사용하는 것을 볼 수 있습니다.

  1. 구성 파일의 내용을 확인합니다.
cat app.conf

이 실용적인 예제는 Bash 의 기본값이 사용자가 지정한 값의 유무에 관계없이 작동하는 유연한 구성 스크립트를 만드는 데 어떻게 도움이 되는지 보여줍니다.

고급 기본값 기술

이제 Bash 에서 기본값을 설정하는 기본 사항을 이해했으므로 스크립트를 더욱 강력하고 유연하게 만드는 몇 가지 고급 기술을 살펴보겠습니다.

:= 할당 연산자

:= 연산자는 기본값을 대체할 뿐만 아니라 설정되지 않은 경우 해당 값을 변수에 할당합니다. 이는 나중에 사용하기 위해 변수가 기본값을 유지하도록 하려는 경우에 유용합니다.

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

## Demonstrate the := assignment operator
echo "Before assignment, NAME = $NAME"

## This assigns the default value to NAME if it's unset
: ${NAME:="DefaultUser"}

echo "After assignment, NAME = $NAME"

## Now use the variable in a function
greet() {
  echo "Hello, $NAME!"
}

greet
  1. 스크립트를 실행 가능하게 만듭니다.
chmod +x assign_default.sh
  1. NAME 을 설정하지 않고 스크립트를 실행합니다.
./assign_default.sh

다음 출력을 볼 수 있습니다.

Before assignment, NAME =
After assignment, NAME = DefaultUser
Hello, DefaultUser!
  1. 이제 실행하기 전에 NAME 을 설정합니다.
NAME="Alice" ./assign_default.sh

다음 출력을 볼 수 있습니다.

Before assignment, NAME = Alice
After assignment, NAME = Alice
Hello, Alice!

기본값 연결

경우에 따라 하드 코딩된 기본값으로 되돌아가기 전에 여러 소스에서 값을 확인해야 할 수 있습니다. 이를 위해 기본값을 연결할 수 있습니다.

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

## Read config file if it exists
if [[ -f "./user.conf" ]]; then
  source "./user.conf"
fi

## Chain default values: command line arg -> config file -> environment var -> hard-coded default
USERNAME=${1:-${CONFIG_USER:-${USER:-"guest"}}}
LANGUAGE=${2:-${CONFIG_LANG:-${LANG:-"en_US"}}}

echo "Hello, $USERNAME! Your language is set to $LANGUAGE."
  1. 스크립트를 실행 가능하게 만듭니다.
chmod +x chain_defaults.sh
  1. 테스트용 구성 파일을 만듭니다.
echo "CONFIG_USER=ConfigUser" > user.conf
echo "CONFIG_LANG=es_ES" >> user.conf
  1. 다양한 조합으로 스크립트를 테스트합니다.
## Use defaults from the config file
./chain_defaults.sh
## Override with command line arguments
./chain_defaults.sh CommandLineUser fr_FR
## Remove config file to test falling back to environment variables
rm user.conf
./chain_defaults.sh

조건부 기본값

조건에 따라 다른 기본값을 설정하기 위해 조건식도 사용할 수 있습니다.

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

## Get the current hour (24-hour format)
HOUR=$(date +%H)

## Set default greeting based on time of day
if ((HOUR < 12)); then
  DEFAULT_GREETING="Good morning"
elif ((HOUR < 18)); then
  DEFAULT_GREETING="Good afternoon"
else
  DEFAULT_GREETING="Good evening"
fi

## Use the conditional default if no greeting is provided
GREETING=${1:-"$DEFAULT_GREETING"}
NAME=${2:-"User"}

echo "$GREETING, $NAME!"
echo "The current time is $(date +%H:%M)."
  1. 스크립트를 실행 가능하게 만듭니다.
chmod +x conditional_defaults.sh
  1. 스크립트를 실행하여 시간대에 따라 기본 인사말을 선택하는 방식을 확인합니다.
./conditional_defaults.sh
  1. 기본 인사말을 재정의합니다.
./conditional_defaults.sh "Hello" "World"

이러한 고급 기술은 Bash 에서 기본값을 사용할 때 더 많은 유연성을 제공하여 더욱 정교하고 사용자 친화적인 스크립트를 만들 수 있도록 합니다.

실제 스크립트에서 기본값 적용

이제 기본값을 설정하는 다양한 기술을 다루었으므로 모든 것을 실제 시나리오에서 사용할 수 있는 실용적인 스크립트에 적용해 보겠습니다.

다양한 구성 옵션에 대한 기본값을 사용하는 백업 스크립트를 만들 것입니다. 이 스크립트는 기본값이 스크립트를 어떻게 더 유연하고 사용자 친화적으로 만드는지 보여줍니다.

백업 스크립트 만들기

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

## Backup script with default values for all parameters

## Source directories to backup (comma-separated) - default to current directory
SRC_DIRS=${1:-$(pwd)}

## Destination directory for backups - default to ~/backups
BACKUP_DIR=${2:-"$HOME/backups"}

## Backup filename prefix - default to "backup"
PREFIX=${3:-"backup"}

## Maximum number of backups to keep - default to 5
MAX_BACKUPS=${4:-5}

## Create destination directory if it doesn't exist
mkdir -p "$BACKUP_DIR"

## Generate timestamp for the backup filename
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/${PREFIX}_${TIMESTAMP}.tar.gz"

echo "Starting backup process..."
echo "Source: $SRC_DIRS"
echo "Destination: $BACKUP_FILE"

## Create the backup archive (we'll simulate this for the lab)
echo "Creating backup archive..."
echo "tar -czf $BACKUP_FILE $SRC_DIRS" > "$BACKUP_DIR/last_backup_command.txt"
touch "$BACKUP_FILE" ## Just create an empty file for demonstration

## Clean up old backups if we have more than MAX_BACKUPS
echo "Checking for old backups to remove..."
NUM_BACKUPS=$(ls -1 "$BACKUP_DIR"/${PREFIX}_*.tar.gz 2> /dev/null | wc -l)
if ((NUM_BACKUPS > MAX_BACKUPS)); then
  NUM_TO_DELETE=$((NUM_BACKUPS - MAX_BACKUPS))
  echo "Removing $NUM_TO_DELETE old backup(s)..."
  ls -1t "$BACKUP_DIR"/${PREFIX}_*.tar.gz | tail -n "$NUM_TO_DELETE" | while read file; do
    echo "Would delete: $file (simulation)"
  done
else
  echo "No old backups need to be removed (keeping $NUM_BACKUPS of $MAX_BACKUPS maximum)"
fi

echo "Backup process completed!"
echo "Backup saved to: $BACKUP_FILE"
  1. 스크립트를 실행 가능하게 만듭니다.
chmod +x backup.sh
  1. 테스트에 필요한 디렉토리를 만듭니다.
mkdir -p ~/backups
mkdir -p ~/test_data
echo "Test file 1" > ~/test_data/file1.txt
echo "Test file 2" > ~/test_data/file2.txt

백업 스크립트 테스트

이제 백업 스크립트를 다양한 매개변수 조합으로 테스트하여 기본값이 실제로 어떻게 작동하는지 살펴보겠습니다.

  1. 모든 기본값으로 스크립트를 실행합니다.
./backup.sh

이렇게 하면 현재 디렉토리가 "backup" 접두사로 ~/backups에 백업됩니다.

  1. 소스 디렉토리를 지정하여 스크립트를 실행합니다.
./backup.sh ~/test_data

이렇게 하면 다른 기본값을 사용하여 test_data 디렉토리가 백업됩니다.

  1. 사용자 지정 소스 및 대상을 사용하여 스크립트를 실행합니다.
./backup.sh ~/test_data ~/project/bash_defaults/my_backups
  1. 모든 매개변수를 지정하여 스크립트를 실행합니다.
./backup.sh ~/test_data ~/project/bash_defaults/my_backups project_backup 3

이 예제는 기본값이 스크립트를 어떻게 유연하게 만드는지 보여줍니다. 사용자는 필요한 만큼의 매개변수를 지정할 수 있으며 스크립트는 여전히 제대로 작동합니다.

결과 확인

다양한 매개변수로 백업 스크립트를 실행한 후 결과를 확인할 수 있습니다.

## Check the default backup location
ls -la ~/backups

## Check the custom backup location (if you used it)
ls -la ~/project/bash_defaults/my_backups

스크립트에서 기본값을 일관되게 사용하면 다양한 환경 및 사용 사례에 더 적합하고 사용자 친화적인 도구를 만들 수 있습니다.

요약

이 랩에서는 강력하고 사용자 친화적인 스크립트를 만들기 위한 기본 기술인 Bash 스크립트에서 기본값을 설정하는 방법을 배웠습니다. 랩을 통해 다음을 수행했습니다.

  • :- 연산자를 사용하여 기본적인 기본값 기술을 사용하는 간단한 스크립트를 만들었습니다.
  • 환경 변수 및 기본값으로 작업했습니다.
  • := 할당 연산자 및 조건부 기본값을 포함한 고급 기본값 기술을 탐구했습니다.
  • 기본값이 스크립트를 어떻게 더 유연하게 만드는지 보여주는 실용적인 백업 스크립트를 개발했습니다.

이러한 기술을 통해 사용자가 예상되는 모든 매개변수를 제공하지 않더라도 스크립트가 잘 작동하여 스크립트를 더 탄력적이고 사용하기 쉽게 만들 수 있습니다. 기본값은 또한 포괄적인 입력 유효성 검사의 필요성을 줄여 스크립트 개발 및 테스트를 단순화합니다.

Bash 스크립트를 계속 작성할 때 사용자 경험과 스크립트의 견고성을 향상시키기 위해 기본값을 자유롭게 사용하십시오. 이 연습은 다양한 환경 및 시나리오에서 스크립트를 더욱 전문적이고 유용하게 만들 것입니다.