Bash 스크립트에서 문자열 서식 지정 방법

ShellBeginner
지금 연습하기

소개

Bash 스크립팅 세계에서 문자열 서식 지정 능력은 매우 중요한 기술입니다. 이 튜토리얼은 기본적인 기술부터 더 발전된 응용 프로그램까지, Bash 문자열 서식 지정의 기본 사항을 안내합니다. 이 랩을 마치면 Bash 스크립트에서 데이터를 효과적으로 조작하고 표시하여 가독성과 사용자 편의성을 높일 수 있습니다.

Bash 에서 기본 문자열 사용법 이해하기

이 첫 번째 단계에서는 Bash 에서 문자열이 어떻게 작동하는지 살펴보고 가장 기본적인 형태의 문자열 사용법을 배웁니다.

Bash 에서 문자열이란 무엇인가요?

Bash 에서 문자열은 단순히 일련의 문자입니다. 문자열은 작은따옴표 (') 또는 큰따옴표 (") 로 묶을 수 있으며, 각 따옴표 방식은 고유한 동작을 합니다.

문자열 작업을 시작하기 위해 첫 번째 스크립트 파일을 열어 보겠습니다.

  1. 편집기에서 basic_string.sh 파일을 엽니다.

    • 사이드바에서 "Explorer" 아이콘을 클릭합니다.
    • ~/project/string_formatting으로 이동합니다.
    • basic_string.sh를 클릭하여 엽니다.
  2. 내용을 다음 코드로 바꿉니다.

#!/bin/bash

## Single quotes example - variables are not expanded
echo 'This is a string with single quotes'

## Double quotes example - variables can be expanded
echo "This is a string with double quotes"

## Creating a variable
name="LabEx User"

## Using a variable with single quotes (will not expand)
echo 'Hello, $name!'

## Using a variable with double quotes (will expand)
echo "Hello, $name!"
  1. Ctrl+S를 누르거나 메뉴에서 "File" > "Save"를 선택하여 파일을 저장합니다.

  2. 이제 터미널에서 스크립트를 실행해 보겠습니다.

    • 터미널이 아직 열려 있지 않으면 엽니다.
    • 작업 디렉토리로 이동합니다.
      cd ~/project/string_formatting
    • 스크립트를 실행합니다.
      ./basic_string.sh

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

This is a string with single quotes
This is a string with double quotes
Hello, $name!
Hello, LabEx User!

작은따옴표와 큰따옴표의 차이점을 확인하십시오. 작은따옴표는 각 문자의 리터럴 값을 유지하는 반면, 큰따옴표는 변수 확장을 허용합니다. 이것은 Bash 문자열 서식 지정의 기본 개념입니다.

문자열 결합

Bash 에서 문자열을 결합하는 방법을 확인하기 위해 스크립트에 추가해 보겠습니다.

  1. basic_string.sh의 끝에 다음 코드를 추가합니다.
## Combining strings
first_name="LabEx"
last_name="User"

## Method 1: Using variable expansion within double quotes
full_name="$first_name $last_name"
echo "Full name: $full_name"

## Method 2: Simple concatenation
greeting="Welcome, "$first_name" "$last_name"!"
echo "$greeting"
  1. 파일을 저장하고 다시 실행합니다.
./basic_string.sh

이제 추가 출력을 볼 수 있습니다.

Full name: LabEx User
Welcome, LabEx User!

문자열 길이 이해

또 다른 기본 연산은 문자열의 길이를 결정하는 것입니다. 스크립트에 이것을 추가해 보겠습니다.

  1. basic_string.sh의 끝에 다음 코드를 추가합니다.
## Getting string length
message="This is a test message."
length=${#message}
echo "The message: $message"
echo "Length of the message: $length characters"
  1. 파일을 저장하고 다시 실행합니다.
./basic_string.sh

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

The message: This is a test message.
Length of the message: 23 characters

이것은 Bash 에서 문자열 사용의 기본 사항을 다룹니다. 이러한 기본 사항을 이해하면 다음 단계에서 살펴볼 더 발전된 문자열 서식 지정 기술을 준비할 수 있습니다.

문자열 내에서 변수 작업하기

이 단계에서는 문자열 내에서 변수를 사용하는 방법에 대해 더 자세히 알아보고 Bash 에서 변수 대체에 대한 다양한 기술을 배웁니다.

변수 대체 기본 사항

변수 대치는 Bash 에서 가장 일반적인 문자열 서식 지정 기술 중 하나입니다. 문자열에 변수를 삽입하는 다양한 방법을 살펴보겠습니다.

  1. 편집기에서 variable_demo.sh 파일을 엽니다.

    • 파일 탐색기에서 ~/project/string_formatting으로 이동합니다.
    • variable_demo.sh를 클릭하여 엽니다.
  2. 내용을 다음 코드로 바꿉니다.

#!/bin/bash

## Basic variable
username="labex"
directory="/home/$username"

echo "User directory: $directory"

## Using curly braces for clarity
file_type="txt"
echo "Looking for files ending with .${file_type}"

## Variable substitution adjacent to text
count=5
echo "Found $countfiles"   ## This won't work as expected
echo "Found ${count}files" ## This works correctly
  1. Ctrl+S를 누르거나 메뉴에서 "File" > "Save"를 선택하여 파일을 저장합니다.

  2. 이제 스크립트를 실행해 보겠습니다.

    ./variable_demo.sh

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

User directory: /home/labex
Looking for files ending with .txt
Found
Found 5files

$countfiles를 인쇄하려는 첫 번째 시도가 숫자를 표시하지 못한 이유는 Bash 가 존재하지 않는 countfiles라는 변수를 찾았기 때문입니다. 중괄호 ${count}를 사용하면 변수 이름이 끝나는 위치를 명확하게 정의할 수 있습니다.

고급 변수 대체

더욱 발전된 변수 대체 기술을 살펴보겠습니다.

  1. variable_demo.sh의 끝에 다음 코드를 추가합니다.
## Default values for variables
## ${variable:-default} uses default if variable is unset or empty
echo "Welcome, ${visitor:-Guest}!"

## Set a variable
visitor="John"
echo "Welcome, ${visitor:-Guest}!"

## ${variable:=default} sets variable to default if it's unset or empty
unset visitor
echo "Welcome, ${visitor:=Guest}!"
echo "Now visitor is set to: $visitor"

## Parameter expansion with substrings
message="Welcome to Bash scripting"
## Extract first 7 characters
echo "${message:0:7}" ## Output: Welcome

## Extract from position 11 to the end
echo "${message:11}" ## Output: Bash scripting
  1. 파일을 저장하고 다시 실행합니다.
    ./variable_demo.sh

추가 출력은 다음과 같이 표시됩니다.

Welcome, Guest!
Welcome, John!
Welcome, Guest!
Now visitor is set to: Guest
Welcome
Bash scripting

실용적인 예: 파일 경로 생성기 만들기

변수 대체를 사용하여 파일 경로를 생성하는 실용적인 예를 만들어 보겠습니다.

  1. variable_demo.sh의 끝에 다음 코드를 추가합니다.
## Practical example: File path generator
username="labex"
project="myproject"
file_name="data"
extension="csv"

## Generate file path using variable substitution
file_path="/home/${username}/projects/${project}/${file_name}.${extension}"
echo "Full file path: $file_path"

## Generate backup file path
backup_path="${file_path}.backup"
echo "Backup file path: $backup_path"

## Timestamp for versioned backups
timestamp=$(date +"%Y%m%d")
versioned_backup="${file_path}.${timestamp}"
echo "Versioned backup: $versioned_backup"
  1. 파일을 저장하고 실행합니다.
    ./variable_demo.sh

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

Full file path: /home/labex/projects/myproject/data.csv
Backup file path: /home/labex/projects/myproject/data.csv.backup
Versioned backup: /home/labex/projects/myproject/data.csv.20231025

정확한 타임스탬프는 현재 날짜에 따라 다릅니다.

이 예제는 변수 대체를 사용하여 파일 경로와 같이 복잡한 문자열을 코드 반복을 최소화하면서 동적으로 생성하는 방법을 보여줍니다. 이 기술은 여러 파일 또는 디렉토리로 작업해야 하는 스크립트에서 특히 유용합니다.

Bash 출력에 색상 및 스타일 추가하기

이 단계에서는 Bash 스크립트에 다채롭고 스타일이 지정된 텍스트를 추가하는 방법을 배웁니다. 스크립트 출력에 색상을 사용하면 가독성을 높이고 중요한 정보를 강조 표시할 수 있습니다.

ANSI 이스케이프 시퀀스 이해

Bash 는 색상, 굵게, 밑줄 등을 포함하여 텍스트 서식을 제어하기 위해 ANSI 이스케이프 시퀀스를 지원합니다. 이러한 시퀀스를 사용하는 방법을 살펴보겠습니다.

  1. 편집기에서 color_formatting.sh 파일을 엽니다.

    • 파일 탐색기에서 ~/project/string_formatting으로 이동합니다.
    • color_formatting.sh를 클릭하여 엽니다.
  2. 내용을 다음 코드로 바꿉니다.

#!/bin/bash

## Basic color examples
## Note: we use echo -e to enable interpretation of backslash escapes

## Text colors
echo -e "\033[31mThis text is red\033[0m"
echo -e "\033[32mThis text is green\033[0m"
echo -e "\033[33mThis text is yellow\033[0m"
echo -e "\033[34mThis text is blue\033[0m"
echo -e "\033[35mThis text is magenta\033[0m"
echo -e "\033[36mThis text is cyan\033[0m"

## Reset color at the end with \033[0m to prevent color bleeding
  1. Ctrl+S를 누르거나 메뉴에서 "File" > "Save"를 선택하여 파일을 저장합니다.

  2. 이제 파일을 실행 가능하게 만들고 실행해 보겠습니다.

    chmod +x color_formatting.sh
    ./color_formatting.sh

텍스트 출력이 다른 색상으로 표시되어야 합니다. 각 줄은 다른 ANSI 색상 코드를 사용하며, 각 줄의 끝에서 \033[0m으로 색상을 재설정합니다.

가독성을 높이기 위해 변수 사용

ANSI 이스케이프 시퀀스는 코드에서 읽기 어려울 수 있습니다. 각 색상에 대한 변수를 정의하여 스크립트를 개선해 보겠습니다.

  1. 다음 코드로 color_formatting.sh 파일을 업데이트합니다.
#!/bin/bash

## Define color variables for better readability
RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
BLUE='\033[34m'
MAGENTA='\033[35m'
CYAN='\033[36m'
## Reset color
RESET='\033[0m'

## Using color variables
echo -e "${RED}This text is red${RESET}"
echo -e "${GREEN}This text is green${RESET}"
echo -e "${YELLOW}This text is yellow${RESET}"
echo -e "${BLUE}This text is blue${RESET}"
echo -e "${MAGENTA}This text is magenta${RESET}"
echo -e "${CYAN}This text is cyan${RESET}"

## You can also mix colors in a single line
echo -e "This is ${RED}red${RESET}, this is ${GREEN}green${RESET}, and this is ${BLUE}blue${RESET}."
  1. 파일을 저장하고 다시 실행합니다.
    ./color_formatting.sh

출력은 이전과 동일해야 하지만 이제 코드가 훨씬 더 읽기 쉬워졌습니다.

텍스트 스타일 추가

색상 외에도 굵게, 밑줄 및 배경색과 같은 스타일을 추가할 수도 있습니다.

  1. color_formatting.sh의 끝에 다음 코드를 추가합니다.
## Text styles
BOLD='\033[1m'
UNDERLINE='\033[4m'
## Background colors
BG_RED='\033[41m'
BG_GREEN='\033[42m'
BG_YELLOW='\033[43m'

## Examples with styles
echo -e "${BOLD}This text is bold${RESET}"
echo -e "${UNDERLINE}This text is underlined${RESET}"
echo -e "${RED}${BOLD}This text is bold and red${RESET}"

## Examples with background colors
echo -e "${BG_RED}This has a red background${RESET}"
echo -e "${BG_GREEN}${BLUE}Blue text on green background${RESET}"
  1. 파일을 저장하고 다시 실행합니다.
    ./color_formatting.sh

이제 다른 스타일과 배경색으로 텍스트가 표시되어야 합니다.

실용적인 예: 서식 지정된 스크립트 출력

색상과 스타일을 사용하여 스크립트 출력을 서식 지정하는 실용적인 예를 만들어 보겠습니다.

  1. color_formatting.sh의 끝에 다음 코드를 추가합니다.
## Practical example: Script status messages
print_info() {
  echo -e "${CYAN}[INFO]${RESET} $1"
}

print_success() {
  echo -e "${GREEN}[SUCCESS]${RESET} $1"
}

print_warning() {
  echo -e "${YELLOW}[WARNING]${RESET} $1"
}

print_error() {
  echo -e "${RED}[ERROR]${RESET} $1"
}

## Using our formatted output functions
print_info "Starting the process..."
print_success "File successfully downloaded."
print_warning "Disk space is running low."
print_error "Failed to connect to the server."

## Simulating a task with progress updates
echo -e "\n${BOLD}Running a sample task:${RESET}"
for i in {1..5}; do
  print_info "Processing step $i..."
  sleep 1
  print_success "Step $i completed."
done

print_success "All tasks completed successfully!"
  1. 파일을 저장하고 실행합니다.
    ./color_formatting.sh

다양한 유형의 정보를 나타내는 다른 색상으로 서식이 지정된 일련의 메시지가 표시됩니다. 스크립트는 sleep 명령으로 인해 단계 사이에 잠시 멈춥니다.

이 예제는 색상과 스타일을 사용하여 스크립트 출력을 더 체계적이고 이해하기 쉽게 만드는 방법을 보여줍니다. 이는 많은 출력을 생성하거나 정보, 경고 및 오류와 같은 서로 다른 유형의 메시지를 명확하게 구분해야 하는 스크립트에 특히 유용합니다.

Bash 의 고급 문자열 연산

이 마지막 단계에서는 Bash 에서 문자열 조작, 패턴 일치 및 대체 등 더 고급 문자열 연산을 살펴보겠습니다. 이러한 기술을 사용하면 스크립트에서 복잡한 텍스트 처리 작업을 수행할 수 있습니다.

문자열 조작 함수

Bash 는 문자열을 조작하기 위한 여러 내장 메커니즘을 제공합니다. 이러한 연산을 살펴보겠습니다.

  1. 편집기에서 string_ops.sh 파일을 엽니다.

    • 파일 탐색기에서 ~/project/string_formatting으로 이동합니다.
    • string_ops.sh를 클릭하여 엽니다.
  2. 내용을 다음 코드로 바꿉니다.

#!/bin/bash

## String length
message="Hello, Bash scripting world!"
echo "Original message: $message"
echo "Length of message: ${#message} characters"

## Extracting substrings
## Syntax: ${string:position:length}
echo "First 5 characters: ${message:0:5}"
echo "Characters 7-11: ${message:7:5}"
echo "From position 13 to end: ${message:13}"

## Searching and replacing within strings
filename="report.txt.backup"
echo "Original filename: $filename"

## Replace first occurrence
echo "Replace first occurrence of 'txt' with 'pdf': ${filename/txt/pdf}"

## Replace all occurrences
text="one two one two three"
echo "Original text: $text"
echo "Replace all occurrences of 'one' with '1': ${text//one/1}"

## Replace at beginning of string
echo "Replace 'one' at beginning: ${text/#one/1}"

## Replace at end of string
echo "Replace 'three' at end: ${text/%three/3}"
  1. Ctrl+S를 누르거나 메뉴에서 "File" > "Save"를 선택하여 파일을 저장합니다.

  2. 이제 파일을 실행 가능하게 만들고 실행해 보겠습니다.

    chmod +x string_ops.sh
    ./string_ops.sh

다양한 문자열 조작 연산을 보여주는 출력을 볼 수 있습니다.

Original message: Hello, Bash scripting world!
Length of message: 29 characters
First 5 characters: Hello
Characters 7-11: Bash
From position 13 to end: scripting world!
Original filename: report.txt.backup
Replace first occurrence of 'txt' with 'pdf': report.pdf.backup
Original text: one two one two three
Replace all occurrences of 'one' with '1': 1 two 1 two three
Replace 'one' at beginning: 1 two one two three
Replace 'three' at end: one two one two 3

대소문자 변환

Bash 는 텍스트의 대소문자를 변경하는 메커니즘도 제공합니다. 대소문자 변환 예제를 추가해 보겠습니다.

  1. string_ops.sh의 끝에 다음 코드를 추가합니다.
## Case conversion
uppercase="HELLO WORLD"
lowercase="hello world"
mixed="Hello World"

## Converting to uppercase
echo "Original: $lowercase"
echo "Uppercase: ${lowercase^^}"

## Converting to lowercase
echo "Original: $uppercase"
echo "Lowercase: ${uppercase,,}"

## Converting first character to uppercase
echo "Original: $lowercase"
echo "First character uppercase: ${lowercase^}"

## Converting first character to lowercase
echo "Original: $mixed"
echo "First character lowercase: ${mixed,}"
  1. 파일을 저장하고 다시 실행합니다.
    ./string_ops.sh

추가 출력은 대소문자 변환 예제를 보여줍니다.

Original: hello world
Uppercase: HELLO WORLD
Original: HELLO WORLD
Lowercase: hello world
Original: hello world
First character uppercase: Hello world
Original: Hello World
First character lowercase: hello World

문자열 트리밍 및 서식 지정

문자열 트리밍 및 서식 지정 기술의 예제를 추가해 보겠습니다.

  1. string_ops.sh의 끝에 다음 코드를 추가합니다.
## String trimming
path="  /usr/local/bin/  "
echo "Original path with spaces: '$path'"
echo "Trimmed path: '${path// /}'" ## Remove all spaces

## Removing prefixes and suffixes
filename="archive.tar.gz"
echo "Original filename: $filename"
echo "Without .tar.gz extension: ${filename%.tar.gz}"
echo "Without any extension: ${filename%%.*}"
echo "Extract extension: ${filename#*.}"
echo "Extract full extension: ${filename##*.}"

## Padding strings
number=42
printf "Number with leading zeros (5 digits): %05d\n" $number

name="Bob"
printf "Name padded to 10 characters: %-10s|\n" $name
  1. 파일을 저장하고 다시 실행합니다.
    ./string_ops.sh

추가 출력은 트리밍 및 서식 지정 예제를 보여줍니다.

Original path with spaces: '  /usr/local/bin/  '
Trimmed path: '/usr/local/bin/'
Original filename: archive.tar.gz
Without .tar.gz extension: archive
Without any extension: archive
Extract extension: tar.gz
Extract full extension: gz
Number with leading zeros (5 digits): 00042
Name padded to 10 characters: Bob       |

실용적인 예: 로그 파서

고급 문자열 연산을 사용하여 로그 항목을 구문 분석하고 서식을 지정하는 실용적인 예를 만들어 보겠습니다.

  1. string_ops.sh의 끝에 다음 코드를 추가합니다.
## Practical example: Log parser
echo -e "\n--- Log Parser Example ---\n"

## Sample log entries
log_entries=(
  "[2023-10-25 08:15:22] INFO: Application started"
  "[2023-10-25 08:16:45] WARNING: High memory usage detected"
  "[2023-10-25 08:17:30] ERROR: Database connection failed"
  "[2023-10-25 08:18:10] INFO: Backup process initiated"
  "[2023-10-25 08:19:55] ERROR: Out of disk space"
)

## Parse and format log entries
for entry in "${log_entries[@]}"; do
  ## Extract timestamp (everything between [ and ])
  timestamp=${entry#*[}
  timestamp=${timestamp%%]*}

  ## Extract log level (INFO, WARNING, ERROR)
  level=${entry#*] }
  level=${level%%:*}

  ## Extract message
  message=${entry#*: }

  ## Format based on log level
  case $level in
    "INFO")
      printf "%-20s [\033[36m%-7s\033[0m] %s\n" "$timestamp" "$level" "$message"
      ;;
    "WARNING")
      printf "%-20s [\033[33m%-7s\033[0m] %s\n" "$timestamp" "$level" "$message"
      ;;
    "ERROR")
      printf "%-20s [\033[31m%-7s\033[0m] %s\n" "$timestamp" "$level" "$message"
      ;;
  esac
done
  1. 파일을 저장하고 실행합니다.
    ./string_ops.sh

최종 출력 섹션은 로그 수준에 따라 다른 색상으로 서식이 지정된 로그 항목을 표시해야 합니다.

--- Log Parser Example ---

2023-10-25 08:15:22  [INFO   ] Application started
2023-10-25 08:16:45  [WARNING] High memory usage detected
2023-10-25 08:17:30  [ERROR  ] Database connection failed
2023-10-25 08:18:10  [INFO   ] Backup process initiated
2023-10-25 08:19:55  [ERROR  ] Out of disk space

이 로그 파서 예제는 다양한 문자열 연산을 서식 지정 및 색상 코드와 결합하여 원시 텍스트 데이터를 더 읽기 쉽고 구조화된 형식으로 변환하는 방법을 보여줍니다. 이러한 기술은 로그 분석, 데이터 처리 또는 보고를 위한 스크립트를 개발할 때 매우 유용합니다.

요약

이 랩에서는 Bash 스크립트에서 문자열 서식을 지정하기 위한 필수 기술을 배웠습니다. 수행한 작업에 대한 요약은 다음과 같습니다.

  1. 기본 문자열 사용법: Bash 에서 기본 문자열 처리, 작은따옴표와 큰따옴표의 차이점, 문자열 연결 및 문자열 길이 결정에 대해 배웠습니다.

  2. 변수 대체: 기본 대체, 명확성을 위한 중괄호 사용, 기본값 설정 및 부분 문자열 추출을 포함한 다양한 변수 대체 방법을 탐색했습니다.

  3. 색상 및 스타일 서식 지정: ANSI 이스케이프 시퀀스를 사용하여 스크립트 출력을 색상 및 텍스트 스타일로 향상시키는 방법을 발견하여 스크립트 출력을 더 읽기 쉽고 사용자 친화적으로 만들었습니다.

  4. 고급 문자열 연산: 부분 문자열 추출, 패턴 일치, 대체, 대소문자 변환 및 문자열 트리밍과 같은 고급 문자열 조작 기술을 익혔습니다.

이러한 문자열 서식 지정 기술은 Bash 스크립팅 기능을 크게 향상시켜 더 읽기 쉽고 유지 관리 가능하며 사용자 친화적인 스크립트를 만들 수 있도록 해줍니다. Bash 스크립팅 여정을 계속 진행하면서 이러한 기술이 강력한 명령줄 도구 및 자동화 스크립트를 구축하는 데 매우 유용하다는 것을 알게 될 것입니다.