본문 바로가기
C.W.K.
Stream
Lesson 04 of 12 · published

반복문: for, while, until

~12 min · for, while, until, loops

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

for로 목록을 순회하기

for f in *.txt; do
  echo "processing $f"
done

for에는 글로브 결과, 직접 적은 값, 명령 치환 결과나 배열을 목록으로 넘길 수 있어.

for로 숫자 범위를 순회하기

# C 형태의 반복문(bash와 zsh)
for ((i=0; i<10; i++)); do echo $i; done
# 중괄호 확장
for i in {1..10}; do echo $i; done
for i in {1..10..2}; do echo $i; done   # 간격

for로 배열 원소를 순회하기

files=("a.txt" "b.txt" "c.txt")
for f in "${files[@]}"; do echo "$f"; done

"${arr[@]}"는 원소마다 인자 하나를 유지해. "${arr[*]}"는 모든 원소를 IFS의 첫 글자로 이어 붙인 문자열 하나를 만들어. 어느 쪽이 맞는지는 받는 명령이 여러 인자를 원하는지 문자열 하나를 원하는지에 달려 있어.

while로 조건이 참인 동안 반복해

i=0
while [[ $i -lt 5 ]]; do
  echo $i
  ((++i))
done

# 파일을 줄 단위로 읽기
while IFS= read -r line; do
  echo "> $line"
done < input.txt

IFS= read -r는 앞뒤 공백과 역슬래시를 보존하므로 파일을 줄 단위로 읽을 때 안전한 기본 형태야.

조건이 참이 될 때까지 반복하는 until

until ping -c1 server.local; do
  echo 'waiting...'
  sleep 5
done

break와 continue로 흐름 바꾸기

break는 현재 반복문을 끝내고, break 2는 중첩된 두 단계의 반복문을 끝내. continue는 남은 본문을 건너뛰고 다음 반복으로 넘어가.

글로브가 아무것도 못 찾았을 때

for f in *.txt는 셸 설정에 따라 매치가 없으면 글자 그대로 *.txt를 한 번 넘기거나, 아예 오류가 나거나, 빈 목록이 될 수 있어. 스크립트가 어느 셸에서 도는지 정하고 그 동작을 확인해. 파일을 실제로 열기 전에는 [[ -e $f ]] 같은 방어도 유용해.

엄격 모드와 산술식의 만남

bash의 (( expression ))은 계산 결과가 0이면 종료 상태 1을 반환해. 그래서 set -e 아래에서 ((i++))를 단독으로 실행하면 첫 반복에 멈출 수 있어. 값을 먼저 늘려 0이 아닌 결과를 만드는 ((++i))를 쓰거나, 산술 명령의 상태를 명시적으로 처리해.

Code

파일을 줄 단위로·bash
while IFS= read -r line; do
  [[ -z "$line" || "$line" == \#* ]] && continue
  echo "config: $line"
done < ~/.config/myapp.conf

External links

Exercise

주석과 빈 줄을 제외하고 .zshrc를 읽는 루프를 작성해. while IFS= read -r l로 한 줄씩 받고, 조건문에서 빈 줄과 #로 시작하는 줄을 건너뛴 뒤 나머지만 출력해. 마지막 줄에 개행이 없는 파일도 처리하려면 루프 조건에 무엇을 더해야 하는지도 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.