Bash 에서 변수 할당 및 재할당 방법

ShellBeginner
지금 연습하기

소개

이 튜토리얼은 널리 사용되는 셸 스크립팅 언어인 Bash 에서 변수를 할당하고 재할당하는 과정을 안내합니다. 변수는 데이터를 저장하고 조작할 수 있게 해주는 Bash 스크립팅의 기본적인 구성 요소입니다. 이 실습 랩에서는 변수를 선언하고, 값을 할당하고, 명령 및 스크립트에서 사용하는 방법을 배우게 됩니다. 이 튜토리얼을 마치면 Bash 에서 변수를 효과적으로 사용하는 방법에 대한 확실한 이해를 갖게 되어 더 강력하고 유연한 스크립트를 작성할 수 있게 됩니다.

Bash 변수 생성 및 할당

Bash 에서 변수를 사용하면 스크립트에서 나중에 접근하고 수정할 수 있는 데이터를 저장할 수 있습니다. 간단한 변수를 생성하고 값을 할당하는 것부터 시작해 보겠습니다.

LabEx 환경에서 새 터미널을 엽니다. /home/labex/project 디렉토리에 있어야 합니다.

Bash 에서 변수에 값을 할당하려면 다음 구문을 사용합니다.

variable_name=value

등호 주변에 공백이 없어야 합니다.

첫 번째 변수를 생성해 보겠습니다.

  1. 터미널에서 다음 명령을 입력하고 Enter 키를 누릅니다.
name="John"
  1. 변수의 값을 표시하려면 달러 기호 ($) 가 앞에 붙은 변수 이름과 함께 echo 명령을 사용합니다.
echo $name

다음 출력이 표시됩니다.

John
  1. 변수 이름 주위에 큰따옴표를 사용할 수도 있습니다.
echo "My name is $name"

출력:

My name is John
  1. 동일한 변수에 새 값을 다시 할당하려면 할당 연산자 (=) 를 다시 사용하기만 하면 됩니다.
name="Alice"
echo "My name is $name"

출력:

My name is Alice

변수 명명 규칙

Bash 에서 변수를 생성할 때는 다음 명명 규칙을 따르십시오.

  • 변수 이름은 문자, 숫자 및 밑줄을 포함할 수 있습니다.
  • 변수 이름은 문자 또는 밑줄로 시작해야 합니다.
  • 변수 이름은 대소문자를 구분합니다.
  • 변수 이름에는 공백이 허용되지 않습니다.

변수를 연습할 파일을 만들어 보겠습니다. WebIDE 에서 프로젝트 디렉토리에 variables.sh라는 새 파일을 만듭니다.

  1. IDE 에서 "New File" 아이콘을 클릭합니다.
  2. 파일 이름을 variables.sh로 지정합니다.
  3. 파일에 다음 코드를 추가합니다.
#!/bin/bash

## Assigning variables
first_name="John"
last_name="Doe"
age=25

## Displaying variables
echo "First name: $first_name"
echo "Last name: $last_name"
echo "Age: $age"

## Reassigning variables
first_name="Jane"
echo "Updated first name: $first_name"
  1. Ctrl+S 를 누르거나 File → Save 를 클릭하여 파일을 저장합니다.

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

chmod +x variables.sh
  1. 다음 명령으로 스크립트를 실행합니다.
./variables.sh

다음 출력이 표시됩니다.

First name: John
Last name: Doe
Age: 25
Updated first name: Jane

이것은 변수를 생성하고, 값을 할당하고, 새 값을 다시 할당하는 방법을 보여줍니다.

변수 값 및 문자열 연산 작업

이 단계에서는 문자열 연산 및 산술 계산을 포함하여 Bash 에서 변수 값으로 작업하는 다양한 방법을 살펴보겠습니다.

문자열 연산

Bash 는 변수에 저장된 문자열 값을 조작하는 여러 가지 방법을 제공합니다.

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

## String concatenation
greeting="Hello"
name="World"
message="$greeting $name"
echo $message

## String length
text="Welcome to Bash scripting"
length=${#text}
echo "The length of '$text' is $length characters"

## Extracting substrings
substring=${text:0:7}
echo "Substring: $substring"

## Converting to uppercase and lowercase
uppercase=${text^^}
lowercase=${text,,}
echo "Uppercase: $uppercase"
echo "Lowercase: $lowercase"
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x string_operations.sh
  1. 스크립트를 실행합니다.
./string_operations.sh

다음과 유사한 출력이 표시됩니다.

Hello World
The length of 'Welcome to Bash scripting' is 25 characters
Substring: Welcome
Uppercase: WELCOME TO BASH SCRIPTING
Lowercase: welcome to bash scripting

산술 연산

Bash 를 사용하면 변수를 사용하여 산술 연산을 수행할 수도 있습니다.

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

## Assigning numeric values
x=5
y=3

## Basic arithmetic operations
sum=$((x + y))
difference=$((x - y))
product=$((x * y))
quotient=$((x / y))
remainder=$((x % y))

## Display results
echo "x = $x, y = $y"
echo "Sum: $x + $y = $sum"
echo "Difference: $x - $y = $difference"
echo "Product: $x * $y = $product"
echo "Quotient: $x / $y = $quotient"
echo "Remainder: $x % $y = $remainder"

## Increment and decrement
echo "Initial value of x: $x"
x=$((x + 1))
echo "After increment: $x"
x=$((x - 1))
echo "After decrement: $x"

## Compound assignment operators
x+=5
echo "After x+=5: $x"
x-=2
echo "After x-=2: $x"
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x arithmetic_operations.sh
  1. 스크립트를 실행합니다.
./arithmetic_operations.sh

다음과 유사한 출력이 표시됩니다.

x = 5, y = 3
Sum: 5 + 3 = 8
Difference: 5 - 3 = 2
Product: 5 * 3 = 15
Quotient: 5 / 3 = 1
Remainder: 5 % 3 = 2
Initial value of x: 5
After increment: 6
After decrement: 5
After x+=5: 10
After x-=2: 8

사용자 입력을 변수로 읽기

변수는 사용자가 제공한 입력도 저장할 수 있습니다. 사용자에게 입력을 요청하는 스크립트를 만들어 보겠습니다.

  1. user_input.sh라는 파일을 만듭니다.
#!/bin/bash

## Prompt the user for their name
echo "What is your name?"
read user_name

## Prompt the user for their age
echo "How old are you?"
read user_age

## Display the information
echo "Hello, $user_name! You are $user_age years old."

## Calculate birth year (approximate)
current_year=$(date +%Y)
birth_year=$((current_year - user_age))
echo "You were likely born in $birth_year."
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x user_input.sh
  1. 스크립트를 실행합니다.
./user_input.sh
  1. 메시지가 표시되면 이름과 나이를 입력합니다. 스크립트는 인사를 표시하고 대략적인 출생 연도를 계산합니다.

이 단계에서는 문자열 조작, 산술 계산 및 사용자 입력을 포함하여 변수를 사용하여 다양한 작업을 수행하는 방법을 보여주었습니다.

스크립트 및 명령에서 변수 사용

이 단계에서는 Bash 스크립트 및 명령에서 변수를 효과적으로 사용하는 방법을 살펴보겠습니다. 다양한 시나리오에서 변수 사용법을 보여주는 실용적인 스크립트를 만들 것입니다.

변수를 사용한 기본 스크립트 생성

장바구니에 있는 항목의 총 가격을 계산하는 스크립트를 만들어 보겠습니다.

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

## Initialize variables for items and their prices
item1="Laptop"
price1=999
item2="Headphones"
price2=149
item3="Mouse"
price3=25

## Calculate the total price
total=$((price1 + price2 + price3))

## Display the shopping cart
echo "Shopping Cart:"
echo "-------------"
echo "$item1: \$$price1"
echo "$item2: \$$price2"
echo "$item3: \$$price3"
echo "-------------"
echo "Total: \$$total"

## Apply a discount if the total is over $1000
discount_threshold=1000
discount_rate=10

if [ $total -gt $discount_threshold ]; then
  discount_amount=$((total * discount_rate / 100))
  discounted_total=$((total - discount_amount))
  echo "Discount (${discount_rate}%): -\$$discount_amount"
  echo "Final Total: \$$discounted_total"
fi
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x shopping_cart.sh
  1. 스크립트를 실행합니다.
./shopping_cart.sh

다음 출력이 표시됩니다.

Shopping Cart:
-------------
Laptop: $999
Headphones: $149
Mouse: $25
-------------
Total: $1173
Discount (10%): -$117
Final Total: $1056

명령 치환과 함께 변수 사용

명령 치환을 사용하면 명령의 출력을 캡처하여 변수에 저장할 수 있습니다. 이를 보여주는 스크립트를 만들어 보겠습니다.

  1. system_info.sh라는 새 파일을 만듭니다.
#!/bin/bash

## Get current date and time
current_date=$(date +"%Y-%m-%d")
current_time=$(date +"%H:%M:%S")

## Get system information
hostname=$(hostname)
os_type=$(uname -s)
kernel_version=$(uname -r)
uptime_info=$(uptime -p)
memory_free=$(free -h | awk '/^Mem:/ {print $4}')
disk_free=$(df -h / | awk 'NR==2 {print $4}')

## Display the information
echo "System Information Report"
echo "========================="
echo "Date: $current_date"
echo "Time: $current_time"
echo "Hostname: $hostname"
echo "OS Type: $os_type"
echo "Kernel Version: $kernel_version"
echo "Uptime: $uptime_info"
echo "Free Memory: $memory_free"
echo "Free Disk Space: $disk_free"
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x system_info.sh
  1. 스크립트를 실행합니다.
./system_info.sh

다음과 유사한 출력이 표시됩니다 (시스템별 값 포함).

System Information Report
=========================
Date: 2023-11-20
Time: 14:30:25
Hostname: labex
OS Type: Linux
Kernel Version: 5.15.0-1015-aws
Uptime: up 2 hours, 15 minutes
Free Memory: 1.2Gi
Free Disk Space: 15G

루프에서 변수 사용

변수는 루프에서 특히 유용합니다. 이를 보여주는 스크립트를 만들어 보겠습니다.

  1. countdown.sh라는 새 파일을 만듭니다.
#!/bin/bash

## Get countdown start value from user
echo "Enter a number to start countdown:"
read count

## Validate that input is a number
if [[ ! $count =~ ^[0-9]+$ ]]; then
  echo "Error: Please enter a valid number"
  exit 1
fi

## Perform countdown
echo "Starting countdown from $count:"
while [ $count -gt 0 ]; do
  echo $count
  count=$((count - 1))
  sleep 1
done

echo "Blast off!"
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x countdown.sh
  1. 스크립트를 실행합니다.
./countdown.sh
  1. 메시지가 표시되면 작은 숫자 (예: 5) 를 입력합니다.

스크립트는 입력한 숫자부터 카운트다운을 수행하고 각 숫자를 출력한 다음 마지막에 "Blast off!"를 출력합니다.

이러한 예제는 Bash 스크립트 내에서 변수를 다양한 컨텍스트에서 사용하여 스크립트를 더욱 동적이고 유연하게 만드는 방법을 보여줍니다.

변수 범위 및 특수 변수

이 마지막 단계에서는 Bash 의 변수 범위를 살펴보고 Bash 가 제공하는 특수 변수에 대해 알아보겠습니다.

변수 범위 이해

Bash 에서 변수는 액세스할 수 있는 위치를 결정하는 서로 다른 범위를 가질 수 있습니다.

  1. 전역 변수 (Global variables): 전체 스크립트에서 액세스할 수 있습니다.
  2. 지역 변수 (Local variables): 특정 함수 또는 블록 내에서만 액세스할 수 있습니다.

변수 범위를 보여주는 스크립트를 만들어 보겠습니다.

  1. variable_scope.sh라는 새 파일을 만듭니다.
#!/bin/bash

## Global variable
global_var="I am a global variable"

## Function that demonstrates variable scope
demo_scope() {
  ## Local variable
  local local_var="I am a local variable"

  ## Access global variable
  echo "Inside function: global_var = $global_var"

  ## Access local variable
  echo "Inside function: local_var = $local_var"

  ## Modify global variable
  global_var="Global variable modified"
}

## Main script
echo "Before function call: global_var = $global_var"

## This will fail because local_var doesn't exist yet
echo "Before function call: local_var = $local_var"

## Call the function
demo_scope

## After function call
echo "After function call: global_var = $global_var"

## This will fail because local_var is only accessible within the function
echo "After function call: local_var = $local_var"
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x variable_scope.sh
  1. 스크립트를 실행합니다.
./variable_scope.sh

다음과 유사한 출력이 표시됩니다.

Before function call: global_var = I am a global variable
Before function call: local_var =
Inside function: global_var = I am a global variable
Inside function: local_var = I am a local variable
After function call: global_var = Global variable modified
After function call: local_var =

다음 사항에 유의하십시오.

  • 전역 변수 global_var는 함수 내부와 외부 모두에서 액세스할 수 있습니다.
  • 지역 변수 local_var는 함수 내에서만 액세스할 수 있습니다.
  • 전역 변수에 대한 변경 사항은 함수가 종료된 후에도 유지됩니다.

특수 변수 사용

Bash 는 특정 정보를 담고 있는 여러 특수 변수를 제공합니다. 몇 가지를 살펴보겠습니다.

  1. special_variables.sh라는 새 파일을 만듭니다.
#!/bin/bash

## Special variables demonstration
echo "Script name: $0"
echo "Process ID: $$"
echo "Number of arguments: $#"
echo "All arguments: $@"
echo "Exit status of last command: $?"
echo "Current user: $USER"
echo "Current hostname: $HOSTNAME"
echo "Random number: $RANDOM"

## Function to demonstrate positional parameters
show_params() {
  echo "Function received $## parameters"
  echo "Parameter 1: $1"
  echo "Parameter 2: $2"
  echo "Parameter 3: $3"
}

## Call the function with parameters
echo -e "\nCalling function with parameters:"
show_params apple banana cherry

## Demonstrate positional parameters to the script
echo -e "\nScript positional parameters:"
echo "Parameter 1: $1"
echo "Parameter 2: $2"
echo "Parameter 3: $3"
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x special_variables.sh
  1. 몇 가지 인수를 사용하여 스크립트를 실행합니다.
./special_variables.sh arg1 arg2 arg3

다음과 유사한 출력이 표시됩니다.

Script name: ./special_variables.sh
Process ID: 12345
Number of arguments: 3
All arguments: arg1 arg2 arg3
Exit status of last command: 0
Current user: labex
Current hostname: labex
Random number: 23456

Calling function with parameters:
Function received 3 parameters
Parameter 1: apple
Parameter 2: banana
Parameter 3: cherry

Script positional parameters:
Parameter 1: arg1
Parameter 2: arg2
Parameter 3: arg3

환경 변수

환경 변수는 셸 및 프로그램의 동작에 영향을 미치는 특수 변수입니다. 이를 탐색하는 스크립트를 만들어 보겠습니다.

  1. environment_variables.sh라는 새 파일을 만듭니다.
#!/bin/bash

## Display common environment variables
echo "HOME directory: $HOME"
echo "Current user: $USER"
echo "Shell: $SHELL"
echo "Path: $PATH"
echo "Current working directory: $PWD"
echo "Terminal: $TERM"
echo "Language: $LANG"

## Creating and exporting a new environment variable
echo -e "\nCreating a new environment variable:"
MY_VAR="Hello from environment variable"
export MY_VAR
echo "MY_VAR = $MY_VAR"

## Demonstrate that child processes inherit environment variables
echo -e "\nAccessing environment variable from a child process:"
bash -c 'echo "Child process sees MY_VAR = $MY_VAR"'

## Remove the environment variable
echo -e "\nRemoving the environment variable:"
unset MY_VAR
echo "MY_VAR = $MY_VAR (should be empty)"
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x environment_variables.sh
  1. 스크립트를 실행합니다.
./environment_variables.sh

다양한 환경 변수를 표시하고 환경 변수를 생성, 액세스 및 제거하는 방법을 보여주는 출력이 표시됩니다.

이 단계에서는 Bash 에서 변수 범위가 어떻게 작동하는지 보여주고 스크립트 내에서 유용한 정보를 제공하는 특수 변수를 소개했습니다.

요약

이 랩에서는 Bash 스크립팅에서 변수를 사용하는 기본 사항을 배웠습니다. 다음 사항에 대한 실질적인 경험을 얻었습니다.

  • 변수를 생성하고 값을 할당하는 방법
  • 문자열 연산 및 산술 계산 작업
  • 스크립트 및 명령에서 변수 사용
  • 변수 범위 이해 및 특수 변수 사용

이러한 기술은 Bash 스크립팅의 기초를 형성하며, 더 정교하고 강력한 스크립트를 작성할 수 있게 해줍니다. 변수는 스크립트를 동적이고 재사용 가능하게 만드는 데 필수적인 도구이며, 서로 다른 입력 및 시나리오에 적응할 수 있도록 해줍니다.

Bash 스크립팅 여정을 계속 진행하면서 다음 핵심 사항을 기억하십시오.

  • 항상 설명적인 변수 이름을 선택하십시오.
  • 함수를 작성할 때 변수 범위를 염두에 두십시오.
  • 스크립트 내에서 유용한 정보에 액세스하려면 특수 변수를 사용하십시오.
  • 구성 및 사용자 지정을 위해 환경 변수를 활용하십시오.

이러한 기술을 통해 이제 작업을 자동화하고 시스템을 관리하기 위한 더 복잡한 Bash 스크립트를 만들 수 있습니다.