for 와 while 을 사용한 반복문

ShellBeginner
지금 연습하기

소개

편지 1,000 통에 서명해야 한다고 생각해 보세요. 한 통에 서명하는 일은 쉽지만, 1,000 통에 서명하는 일은 지루하고 손도 아픕니다. 프로그래밍에서는 이렇게 지루한 반복 작업을 피하고 싶어 합니다.

이 문제를 해결하기 위해 **반복문 (loop)**을 사용합니다. 반복문은 컴퓨터에 목록의 각 항목에 대해 작업을 반복하거나, 조건이 바뀔 때까지 작업을 계속하라고 지시하는 방법입니다.

반복문은 자동화의 핵심입니다. 컴퓨터는 반복 작업을 잘하지만 사람은 반복 작업에 약하기 때문입니다. 같은 명령 패턴을 계속 반복하고 있다면, 그 작업에는 반복문을 사용할 수 있다는 신호인 경우가 많습니다.

이 실습에서는 직접 디지털 작업 라인을 만들어 봅니다.

  1. 카운터: 대신 숫자를 세어 주는 반복문 (for 반복문)
  2. 작업자: 여러 파일을 하나씩 처리하는 반복문 (파일과 함께 사용하는 for 반복문)
  3. 감시자: 목표가 충족될 때까지 계속 작업하는 반복문 (while 반복문)

숫자 반복문 (For 반복문)

for 반복문은 체크리스트와 같습니다. 항목 목록이 있으면 목록의 각 항목에 대해 작업을 수행합니다.

이 방식은 Unix 계열 시스템에서 가장 유용한 자동화 패턴 중 하나입니다. 컴퓨터는 작은 작업을 일관되게 반복하는 데 매우 능숙하므로, 반복문을 사용하면 같은 명령을 계속 복사하지 않고도 한 항목에 대한 작업을 여러 항목에 적용할 수 있습니다.

가장 간단한 목록인 숫자부터 시작합니다. 컴퓨터에 1 부터 5 까지 세도록 지시해 보겠습니다.

먼저 작업 디렉터리를 확인합니다.

cd ~/project

num_loop.sh라는 스크립트를 만듭니다.

nano num_loop.sh

다음 코드를 입력합니다.

#!/bin/bash

for i in {1..5}; do
  echo "Number: $i"
done

작업 라인 해석하기:

  • for i in {1..5}: 기계의 공급 장치입니다. 숫자 1, 2, 3, 4, 5 를 하나씩 변수 $i에 전달합니다.
  • do: 작업을 시작합니다.
  • echo ...: 각 항목에 대해 수행할 작업입니다.
  • done: 현재 항목에 대한 작업을 끝내고 다음 항목을 가져옵니다.

{1..5} 부분은 **중괄호 확장 (brace expansion)**이라는 Bash 의 축약 문법입니다. 반복문이 시작되기 전에 Bash 가 이 표현식을 값 목록으로 확장합니다. 따라서 반복문은 미리 준비된 목록을 한 번에 하나씩 순회합니다.

저장하려면 Ctrl+O를 누르고, 종료하려면 Ctrl+X를 누릅니다.

스크립트를 실행할 수 있도록 권한을 부여한 뒤 실행합니다.

chmod +x num_loop.sh
./num_loop.sh

다음과 같이 숫자를 세는 출력이 표시됩니다.

Number: 1
Number: 2
Number: 3
Number: 4
Number: 5

파일 반복문 (For 반복문)

숫자를 세는 것도 재미있지만, 파일을 처리하는 작업은 더욱 유용합니다. for 반복문은 *.txt와 같은 와일드카드와 함께 사용하면 매우 강력합니다. 스크립트에 다음과 같이 지시할 수 있습니다. "이 폴더에서 찾은 모든 텍스트 파일에 대해 X 작업을 수행하라."

작업 폴더에는 이미 샘플 텍스트 파일이 만들어져 있습니다. 이 파일들을 찾는 스크립트를 작성해 보겠습니다.

file_loop.sh라는 새 파일을 만듭니다.

nano file_loop.sh

다음 코드를 입력합니다.

#!/bin/bash

echo "Listing text files:"
for file in *.txt; do
  echo "Found file: $file"
done

동작 원리:

{1..5}와 같은 숫자 대신 *.txt 패턴을 반복문에 전달합니다.

Bash 는 폴더를 확인하고 data1.txt, notes.txt와 같이 패턴에 일치하는 모든 파일을 찾은 다음, 그 파일을 하나씩 $file 변수에 전달합니다.

이 일치 확인 작업은 반복문 본문이 실행되기 전에 수행됩니다. 셸은 *.txt를 파일 이름 목록으로 확장한 다음, for 반복문이 그 목록을 순회합니다. 따라서 셸 스크립팅에서 반복문과 glob 패턴을 함께 사용하면 매우 효과적입니다.

파일을 저장하고 종료합니다.

스크립트를 실행합니다.

chmod +x file_loop.sh
./file_loop.sh

출력은 다음과 같습니다.

Listing text files:
Found file: data1.txt
Found file: data2.txt
Found file: notes.txt

단순히 echo를 사용하는 대신 mv를 사용해 파일을 이동하거나 zip을 사용해 파일을 보관할 수도 있습니다. 동일한 4 줄짜리 스크립트로 10,000 개의 파일을 몇 초 만에 처리할 수 있습니다.

조건 반복문 (While 반복문)

for 반복문은 숫자나 파일 목록이 있을 때 유용합니다. 하지만 목록이 없다면 어떻게 해야 할까요? 단지 "어떤 일이 일어날 때까지 계속 작업"하고 싶다면 어떻게 해야 할까요?

이럴 때 사용하는 것이 While 반복문입니다. 온도 조절기와 비슷합니다. "방이 추운 동안에는 히터를 계속 켜 둔다"라고 생각하면 됩니다.

수동으로 10 까지 세는 스크립트를 작성해 보겠습니다.

while_loop.sh를 만듭니다.

nano while_loop.sh

다음 코드를 입력합니다.

#!/bin/bash

counter=1

while [ $counter -le 10 ]; do
  echo "Count: $counter"
  ((counter++))
done

온도 조절기 해석하기:

  • while [ $counter -le 10 ]: 조건입니다. "counter 가 10 보다 작거나 같은가?"를 확인합니다.
    • YES: 반복문에 들어갑니다.
    • NO: 반복을 중지합니다.
  • ((counter++)): 갱신 작업입니다. counter에 1 을 더합니다. 중요: 이 줄을 빠뜨리면 counter가 계속 1 로 유지되어 스크립트가 영원히 실행됩니다 ("무한 반복문").

이 예제는 for와 while의 핵심적인 차이를 보여 줍니다. for 반복문은 보통 셸에서 미리 순서를 전달받습니다. 반면 while 반복문은 스크립트가 실행되는 동안 올바르게 갱신해야 하는 조건에 따라 동작합니다.

((counter++)) 구문은 Bash 의 산술 표현식 문법입니다. 셸에 counter를 숫자로 처리하고 1 씩 증가시키라고 지시합니다. 셸 스크립트는 텍스트 처리와 간단한 산술 연산을 함께 사용하는 경우가 많으므로, 이 구문이 자주 등장합니다.

파일을 저장하고 종료합니다.

스크립트를 실행합니다.

chmod +x while_loop.sh
./while_loop.sh

for 반복문과 비슷하게 동작하지만 논리는 다릅니다. for는 목록을 순회하고, while은 조건에 따라 반복합니다.

요약

첫 번째 자동화 엔진을 직접 만들어 보았습니다.

이 실습에서 다음 내용을 익혔습니다.

  1. 체크리스트 (for): 숫자 {1..5}와 같이 정해진 항목 목록을 처리합니다.
  2. 일괄 처리기 (for *.txt): 디렉터리의 모든 파일을 자동으로 처리합니다.
  3. 온도 조절기 (while): 특정 목표나 제한에 도달할 때까지 작업을 반복합니다.

이러한 반복문은 스크립팅의 핵심 도구입니다. 수동 클릭 1,000 번이 필요한 작업을 컴퓨터의 1 초 작업으로 바꿔 줍니다.