for로 목록을 순회하기
for f in *.txt; do
echo "processing $f"
donefor에는 글로브 결과, 직접 적은 값, 명령 치환 결과나 배열을 목록으로 넘길 수 있어.
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.txtIFS= read -r는 앞뒤 공백과 역슬래시를 보존하므로 파일을 줄 단위로 읽을 때 안전한 기본 형태야.
조건이 참이 될 때까지 반복하는 until
until ping -c1 server.local; do
echo 'waiting...'
sleep 5
donebreak와 continue로 흐름 바꾸기
break는 현재 반복문을 끝내고, break 2는 중첩된 두 단계의 반복문을 끝내. continue는 남은 본문을 건너뛰고 다음 반복으로 넘어가.
글로브가 아무것도 못 찾았을 때
for f in *.txt는 셸 설정에 따라 매치가 없으면 글자 그대로 *.txt를 한 번 넘기거나, 아예 오류가 나거나, 빈 목록이 될 수 있어. 스크립트가 어느 셸에서 도는지 정하고 그 동작을 확인해. 파일을 실제로 열기 전에는 [[ -e $f ]] 같은 방어도 유용해.
엄격 모드와 산술식의 만남
bash의 (( expression ))은 계산 결과가 0이면 종료 상태 1을 반환해. 그래서 set -e 아래에서 ((i++))를 단독으로 실행하면 첫 반복에 멈출 수 있어. 값을 먼저 늘려 0이 아닌 결과를 만드는 ((++i))를 쓰거나, 산술 명령의 상태를 명시적으로 처리해.