Bash 배열 요소 한 줄에 하나씩 출력하는 방법

ShellBeginner
지금 연습하기

소개

이 튜토리얼에서는 Bash 배열을 살펴보고 각 요소를 새 줄에 출력하는 방법을 배웁니다. 이는 셸 스크립팅에서 흔히 요구되는 사항입니다. Bash 배열을 사용하면 단일 변수에 여러 값을 저장할 수 있으므로 스크립트에서 데이터를 구성하는 데 필수적입니다.

이 랩을 마치면 배열을 생성하고, 배열 요소를 조작하며, 배열 내용을 한 줄에 하나씩 출력하는 다양한 기술을 사용하는 방법을 이해하게 될 것입니다. 이러한 기술은 파일 목록 처리, 명령 출력 처리, 시스템 관리 작업 자동화와 같은 작업에 대해 보다 효율적이고 읽기 쉬운 셸 스크립트를 작성하는 데 도움이 될 것입니다.

Bash 배열 생성 및 이해

Bash 배열을 사용하면 단일 변수에 여러 값을 저장할 수 있습니다. 이제 배열을 생성하고 사용하는 방법을 알아보겠습니다.

첫 번째 배열 생성하기

WebIDE 에서 터미널을 엽니다. 기본적으로 /home/labex/project 디렉토리에 있어야 합니다. 간단한 Bash 스크립트를 생성하는 것으로 시작해 보겠습니다.

  1. WebIDE 에서 탐색기 패널의 "New File" 아이콘을 클릭하거나 "File > New File" 메뉴 옵션을 사용하여 array_demo.sh라는 새 파일을 생성합니다.

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

#!/bin/bash

## 과일 배열 생성
fruits=("apple" "banana" "orange" "grape" "kiwi")

## 전체 배열 출력
echo "All fruits: ${fruits[@]}"

## 첫 번째 요소(인덱스 0) 출력
echo "First fruit: ${fruits[0]}"

## 세 번째 요소(인덱스 2) 출력
echo "Third fruit: ${fruits[2]}"

## 배열의 요소 수 출력
echo "Number of fruits: ${#fruits[@]}"
  1. Ctrl+S 를 누르거나 "File > Save" 메뉴 옵션을 사용하여 파일을 저장합니다.

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

chmod +x /home/labex/project/array_demo.sh
  1. 스크립트를 실행합니다.
./array_demo.sh

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

All fruits: apple banana orange grape kiwi
First fruit: apple
Third fruit: orange
Number of fruits: 5

배열 구문 이해

배열 구문을 자세히 살펴보겠습니다.

  • 배열 생성: fruits=("apple" "banana" "orange" "grape" "kiwi")
    이것은 fruits라는 이름의 배열을 생성하고 다섯 개의 요소를 할당합니다.

  • 모든 요소에 접근: ${fruits[@]}
    @ 기호는 배열의 모든 요소를 참조합니다.

  • 특정 요소에 접근: ${fruits[0]}, ${fruits[2]}
    Bash 의 배열은 0 부터 시작하는 인덱스를 사용합니다. 즉, 첫 번째 요소는 인덱스 0 에 있습니다.

  • 배열 길이 가져오기: ${#fruits[@]}
    배열 참조 앞에 # 기호가 있으면 요소의 수를 반환합니다.

배열을 생성하는 다양한 방법

배열을 생성하는 다양한 방법을 보여주기 위해 새 스크립트를 생성해 보겠습니다.

  1. array_creation.sh라는 새 파일을 생성합니다.
#!/bin/bash

## 방법 1: 직접 선언
colors=("red" "green" "blue" "yellow")
echo "Colors array: ${colors[@]}"

## 방법 2: 개별 요소 할당
shapes=()
shapes[0]="circle"
shapes[1]="square"
shapes[2]="triangle"
echo "Shapes array: ${shapes[@]}"

## 방법 3: 명령 출력에서 배열 생성
files=($(ls /home/labex/project))
echo "Files in current directory: ${files[@]}"

## 방법 4: 문자열에서 배열 생성
data="one two three four"
numbers=($data)
echo "Numbers array: ${numbers[@]}"
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x /home/labex/project/array_creation.sh
  1. 스크립트를 실행합니다.
./array_creation.sh

생성한 모든 다른 배열을 보여주는 출력을 볼 수 있습니다. 파일 배열에 대한 정확한 출력은 디렉토리에 존재하는 파일에 따라 달라집니다.

이 예제는 Bash 배열의 유연성과 필요에 따라 다양한 방식으로 배열을 생성하는 방법을 보여줍니다.

배열 요소 조작

이제 배열을 생성하는 방법을 알았으니, 요소를 추가, 제거 및 수정하여 배열을 조작하는 방법을 알아보겠습니다.

배열 요소 수정

배열 조작을 보여주기 위해 새 스크립트를 생성해 보겠습니다.

  1. WebIDE 에서 array_manipulation.sh라는 새 파일을 생성합니다.
#!/bin/bash

## 초기 배열 생성
fruits=("apple" "banana" "orange")
echo "Initial array: ${fruits[@]}"

## 배열 끝에 요소 추가
fruits+=("grape")
echo "After adding grape: ${fruits[@]}"

## 여러 요소 추가
fruits+=("kiwi" "mango")
echo "After adding kiwi and mango: ${fruits[@]}"

## 요소 변경
fruits[1]="blueberry"
echo "After changing banana to blueberry: ${fruits[@]}"

## 요소 제거 (빈 슬롯이 남음)
unset fruits[2]
echo "After removing the third element: ${fruits[@]}"

## 배열 인덱스 출력
echo "Array indices: ${!fruits[@]}"

## 빈 슬롯을 제거하기 위해 배열 다시 생성
new_fruits=()
for fruit in "${fruits[@]}"; do
  if [[ -n "$fruit" ]]; then
    new_fruits+=("$fruit")
  fi
done

fruits=("${new_fruits[@]}")
echo "After removing empty slots: ${fruits[@]}"
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x /home/labex/project/array_manipulation.sh
  1. 스크립트를 실행합니다.
./array_manipulation.sh

출력은 각 작업에 따라 배열이 어떻게 변경되는지 보여줍니다.

Initial array: apple banana orange
After adding grape: apple banana orange grape
After adding kiwi and mango: apple banana orange grape kiwi mango
After changing banana to blueberry: apple blueberry orange grape kiwi mango
After removing the third element: apple blueberry  grape kiwi mango
Array indices: 0 1 3 4 5
After removing empty slots: apple blueberry grape kiwi mango

배열 슬라이싱

배열의 일부를 추출하는 방법을 살펴보겠습니다.

  1. array_slicing.sh라는 새 파일을 생성합니다.
#!/bin/bash

## 샘플 배열 생성
colors=("red" "orange" "yellow" "green" "blue" "indigo" "violet")
echo "Full array: ${colors[@]}"

## 하위 배열 추출 (시작 인덱스 및 길이)
## 구문: ${array[@]:start:length}
sub_array1=("${colors[@]:1:3}")
echo "Sub-array (indices 1-3): ${sub_array1[@]}"

## 인덱스에서 끝까지 추출
sub_array2=("${colors[@]:4}")
echo "Sub-array (from index 4 to end): ${sub_array2[@]}"

## 마지막 두 요소 추출
sub_array3=("${colors[@]: -2}") ## -2 앞에 공백이 있습니다.
echo "Last two elements: ${sub_array3[@]}"
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x /home/labex/project/array_slicing.sh
  1. 스크립트를 실행합니다.
./array_slicing.sh

출력은 배열을 슬라이싱하는 다양한 방법을 보여줍니다.

Full array: red orange yellow green blue indigo violet
Sub-array (indices 1-3): orange yellow green
Sub-array (from index 4 to end): blue indigo violet
Last two elements: indigo violet

배열에서 요소 찾기

배열에서 요소를 검색하는 방법을 보여주기 위해 스크립트를 생성해 보겠습니다.

  1. array_searching.sh라는 새 파일을 생성합니다.
#!/bin/bash

## 샘플 배열 생성
fruits=("apple" "banana" "orange" "grape" "kiwi")
echo "Our fruits: ${fruits[@]}"

## 배열에서 요소를 검색하는 함수
search_array() {
  local needle="$1"
  shift
  local haystack=("$@")

  for i in "${!haystack[@]}"; do
    if [[ "${haystack[$i]}" == "$needle" ]]; then
      echo "Found '$needle' at index $i"
      return 0
    fi
  done

  echo "'$needle' not found in the array"
  return 1
}

## 몇 가지 과일 검색
search_array "orange" "${fruits[@]}"
search_array "banana" "${fruits[@]}"
search_array "watermelon" "${fruits[@]}"
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x /home/labex/project/array_searching.sh
  1. 스크립트를 실행합니다.
./array_searching.sh

출력은 다른 요소를 검색한 결과를 보여줍니다.

Our fruits: apple banana orange grape kiwi
Found 'orange' at index 2
Found 'banana' at index 1
'watermelon' not found in the array

이 예제는 Bash 배열에서 수행할 수 있는 일반적인 작업을 보여줍니다. 이는 스크립트에서 데이터 컬렉션으로 작업하는 데 필수적인 기술입니다.

배열 요소 한 줄에 하나씩 출력하기

이 단계에서는 랩의 주요 주제인 배열 요소를 한 줄에 하나씩 출력하는 데 중점을 둡니다. Bash 에서 이를 달성하기 위한 다양한 방법을 살펴보겠습니다.

방법 1: For 루프 사용

배열 요소를 한 줄에 하나씩 출력하는 가장 간단한 방법은 for 루프를 사용하는 것입니다.

  1. print_array_loop.sh라는 새 파일을 생성합니다.
#!/bin/bash

## 샘플 배열 생성
planets=("Mercury" "Venus" "Earth" "Mars" "Jupiter" "Saturn" "Uranus" "Neptune")

echo "Printing planets using a for loop:"
for planet in "${planets[@]}"; do
  echo "$planet"
done
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x /home/labex/project/print_array_loop.sh
  1. 스크립트를 실행합니다.
./print_array_loop.sh

출력은 각 행성에 대해 별도의 줄에 표시됩니다.

Printing planets using a for loop:
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune

방법 2: printf 명령 사용

printf 명령은 echo와 함께 루프를 사용하는 것보다 더 효율적인 경우가 많습니다.

  1. print_array_printf.sh라는 새 파일을 생성합니다.
#!/bin/bash

## 샘플 배열 생성
planets=("Mercury" "Venus" "Earth" "Mars" "Jupiter" "Saturn" "Uranus" "Neptune")

echo "Printing planets using printf:"
printf "%s\n" "${planets[@]}"
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x /home/labex/project/print_array_printf.sh
  1. 스크립트를 실행합니다.
./print_array_printf.sh

출력은 이전 방법과 동일합니다.

Printing planets using printf:
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune

방법 3: IFS 변수 사용

IFS(Internal Field Separator) 변수를 사용하여 배열 요소가 출력되는 방식을 제어할 수 있습니다.

  1. print_array_ifs.sh라는 새 파일을 생성합니다.
#!/bin/bash

## 샘플 배열 생성
planets=("Mercury" "Venus" "Earth" "Mars" "Jupiter" "Saturn" "Uranus" "Neptune")

echo "Printing planets using IFS:"
## 임시로 IFS를 개행 문자로 변경
old_IFS="$IFS"
IFS=$'\n'
echo "${planets[*]}" ## 참고: IFS와 함께 @ 대신 * 사용
IFS="$old_IFS"       ## 원래 IFS 복원
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x /home/labex/project/print_array_ifs.sh
  1. 스크립트를 실행합니다.
./print_array_ifs.sh

출력은 다시 각 행성을 별도의 줄에 표시합니다.

Printing planets using IFS:
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune

방법 4: 여러 기술 결합

이러한 기술을 보다 포괄적인 예제에서 결합해 보겠습니다.

  1. print_array_combined.sh라는 새 파일을 생성합니다.
#!/bin/bash

## 샘플 배열 생성
planets=("Mercury" "Venus" "Earth" "Mars" "Jupiter" "Saturn" "Uranus" "Neptune")

echo "Using a for loop with index:"
for i in "${!planets[@]}"; do
  echo "Planet $i: ${planets[$i]}"
done

echo -e "\nUsing printf with formatting:"
printf "Planet: %s - %d letters\n" "${planets[@]}" "${#planets[@]}"

echo -e "\nSorted planets:"
printf "%s\n" "${planets[@]}" | sort
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x /home/labex/project/print_array_combined.sh
  1. 스크립트를 실행합니다.
./print_array_combined.sh

출력은 배열 요소를 형식화하고 출력하는 다양한 방법을 보여줍니다.

Using a for loop with index:
Planet 0: Mercury
Planet 1: Venus
Planet 2: Earth
Planet 3: Mars
Planet 4: Jupiter
Planet 5: Saturn
Planet 6: Uranus
Planet 7: Neptune

Using printf with formatting:
Planet: Mercury - 8 letters
Planet: Venus - 5 letters
Planet: Earth - 5 letters
Planet: Mars - 4 letters
Planet: Jupiter - 7 letters
Planet: Saturn - 6 letters
Planet: Uranus - 7 letters
Planet: Neptune - 7 letters

Sorted planets:
Earth
Jupiter
Mars
Mercury
Neptune
Saturn
Uranus
Venus

각 방법에는 장점이 있습니다.

  • for 루프는 초보자에게 가장 읽기 쉽습니다.
  • printf 방법은 큰 배열에 더 효율적입니다.
  • IFS 방법은 간결하지만 직관적이지 않을 수 있습니다.
  • 결합된 기술은 풍부한 형식 옵션을 제공할 수 있습니다.

특정 사용 사례 및 코딩 스타일에 가장 적합한 방법을 선택하십시오.

배열을 사용한 실용적인 응용

이 마지막 단계에서는 Bash 배열의 실제 응용 프로그램을 살펴보고 요소들을 한 줄에 하나씩 출력하기 위해 배운 기술을 적용합니다.

파일 목록 처리

디렉토리의 파일을 처리하는 스크립트를 만들어 보겠습니다.

  1. 먼저, 작업할 샘플 파일을 몇 개 만들어 보겠습니다.
mkdir -p /home/labex/project/sample_files
touch /home/labex/project/sample_files/file1.txt
touch /home/labex/project/sample_files/file2.txt
touch /home/labex/project/sample_files/file3.txt
touch /home/labex/project/sample_files/image1.jpg
touch /home/labex/project/sample_files/image2.jpg
  1. process_files.sh라는 새 파일을 생성합니다.
#!/bin/bash

## 디렉토리의 파일 목록 가져오기
file_path="/home/labex/project/sample_files"
files=($(ls "$file_path"))

echo "All files in directory:"
printf "%s\n" "${files[@]}"

echo -e "\nProcessing text files only:"
text_files=()

## 텍스트 파일 필터링
for file in "${files[@]}"; do
  if [[ "$file" == *.txt ]]; then
    text_files+=("$file")
  fi
done

## 각 텍스트 파일 처리
if [ ${#text_files[@]} -eq 0 ]; then
  echo "No text files found."
else
  echo "Found ${#text_files[@]} text files:"
  for file in "${text_files[@]}"; do
    echo "Processing $file..."
    ## 여기에서 일반적으로 각 파일로 무언가를 수행합니다.
    echo "  - Adding content to $file"
    echo "This is sample content" > "$file_path/$file"
  done
fi

## 내용 확인
echo -e "\nContent of text files:"
for file in "${text_files[@]}"; do
  echo "--- $file ---"
  cat "$file_path/$file"
  echo "------------"
done
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x /home/labex/project/process_files.sh
  1. 스크립트를 실행합니다.
./process_files.sh

출력은 배열을 사용하여 파일을 처리하고 필터링하는 방법을 보여줍니다.

All files in directory:
file1.txt
file2.txt
file3.txt
image1.jpg
image2.jpg

Processing text files only:
Found 3 text files:
Processing file1.txt...
  - Adding content to file1.txt
Processing file2.txt...
  - Adding content to file2.txt
Processing file3.txt...
  - Adding content to file3.txt

Content of text files:
--- file1.txt ---
This is sample content
------------
--- file2.txt ---
This is sample content
------------
--- file3.txt ---
This is sample content
------------

간단한 메뉴 시스템 만들기

배열은 스크립트에서 메뉴 시스템을 만드는 데 유용할 수 있습니다.

  1. menu_system.sh라는 새 파일을 생성합니다.
#!/bin/bash

## 메뉴 옵션 정의
options=("List Files" "Check Disk Space" "Display Date" "Display Users" "Exit")

while true; do
  echo -e "\nMenu Options:"
  ## 번호가 있는 메뉴 출력
  for i in "${!options[@]}"; do
    echo "  $((i + 1)). ${options[$i]}"
  done

  ## 사용자 선택 가져오기
  read -p "Enter your choice (1-${#options[@]}): " choice

  ## 0 기반 인덱스로 변환
  ((choice--))

  ## 선택 처리
  case $choice in
    0) ## List Files
      echo -e "\nFiles in current directory:"
      ls -la /home/labex/project
      ;;
    1) ## Check Disk Space
      echo -e "\nDisk space usage:"
      df -h
      ;;
    2) ## Display Date
      echo -e "\nCurrent date and time:"
      date
      ;;
    3) ## Display Users
      echo -e "\nCurrently logged in users:"
      who
      ;;
    4) ## Exit
      echo "Exiting menu system. Goodbye!"
      exit 0
      ;;
    *)
      echo "Invalid choice. Please try again."
      ;;
  esac

  ## 다시 메뉴를 표시하기 전에 일시 중지
  read -p "Press Enter to continue..."
done
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x /home/labex/project/menu_system.sh
  1. 스크립트를 실행합니다.
./menu_system.sh
  1. 메뉴 시스템이 표시됩니다. 다른 옵션을 선택하여 결과를 확인하십시오. 완료되면 옵션 5 를 선택하여 종료합니다.

명령 출력 처리

배열은 명령의 출력을 처리하는 데 매우 적합합니다.

  1. process_command_output.sh라는 새 파일을 생성합니다.
#!/bin/bash

## 실행 중인 프로세스 목록 가져오기
echo "Getting list of processes..."
processes=($(ps -e | awk '{print $4}' | tail -n +2))

echo "Found ${#processes[@]} processes"
echo -e "\nTop 10 processes:"
printf "%s\n" "${processes[@]:0:10}"

## 고유 프로세스 수 계산
echo -e "\nCounting unique process names..."
declare -A process_count

for process in "${processes[@]}"; do
  ((process_count["$process"]++))
done

echo -e "\nProcess Count Summary:"
for process in "${!process_count[@]}"; do
  echo "$process: ${process_count["$process"]}"
done | sort -rn -k2 | head -10
  1. 파일을 저장하고 실행 가능하게 만듭니다.
chmod +x /home/labex/project/process_command_output.sh
  1. 스크립트를 실행합니다.
./process_command_output.sh

출력은 배열을 사용하여 명령 출력을 처리하는 방법을 보여줍니다. 정확한 출력은 시스템에서 실행 중인 프로세스에 따라 다릅니다.

이 예제는 Bash 배열을 실제 시나리오에서 사용하여 실용적인 문제를 해결하는 방법을 보여줍니다. 항목 목록을 처리하고 읽기 쉬운 형식으로 출력하는 기능은 셸 스크립팅의 기본 기술입니다.

요약

이 랩에서는 Bash 배열로 작업하기 위한 필수 기술을 배웠습니다.

  1. 배열 생성 및 이해

    • 다양한 방법으로 배열 선언
    • 배열 요소 및 속성에 접근
  2. 배열 요소 조작

    • 요소 추가, 제거 및 수정
    • 배열 슬라이싱 및 요소 검색
  3. 배열 요소 한 줄에 하나씩 출력

    • for 루프를 사용하여 배열 반복
    • 효율적인 출력을 위한 printf 명령 사용
    • 사용자 정의 형식 지정을 위한 IFS 변수 활용
    • 고급 출력 형식을 위한 기술 결합
  4. 실용적인 응용

    • 파일 목록 처리
    • 메뉴 시스템 생성
    • 명령 출력 처리

이러한 기술은 Bash 스크립트에서 배열을 사용하는 데 탄탄한 기반을 제공합니다. 이제 데이터 컬렉션을 효율적으로 저장, 조작 및 표시하여 스크립트를 더욱 강력하고 다재다능하게 만들 수 있습니다.

Bash 배열을 마스터하는 핵심은 연습이라는 것을 기억하십시오. 이러한 기술을 자신만의 스크립트에 통합하고 실제 문제를 효율적으로 해결하는 데 어떻게 도움이 되는지 살펴보십시오.