출처
설명
for문을 이용한 루프문 처리 방법을 알아보겠습니다.
문법
for문의 기본 문법은 다음과 같습니다. 주어진 배열에 데이터가 있는 동안 순차적으로 반복됩니다. 반복중에에 if문과 continue, break문을 이용하여 while문의 처음으로 돌아가거나, 탈출하는 것이 가능합니다.
for [ 배열_아이템 ] in [ 배열 ] do 명령1 ${배열_아이템} done
사용예제
숫자 데이터를 이용한 반복
연속된 숫자를 반복하는 방법은 다음과 같습니다. 1에서 100 까지의 숫자를 반복하는 예제입니다.
#!/bin/bash
for vTime in {1..100}
do
echo ${vTime}
done
seq 를 이용한 반복
seq를 이용하여 반복을 처리 할 수 있습니다.
#!/bin/bash
for i in $(seq 1 100); do
do
echo ${i}
done
포멧에 맞는 숫자 반복
포맷에 맞게 숫자를 반복할 수도 있습니다. 00에서 23까지의 형식으로 숫자를 반복하는 방법은 다음과 같습니다.
#!/bin/bash
# 방법 1
for vTime in {00..23}
do
echo ${vTime}
done
# 방법 2
for vTime in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
do
echo $vTime
done
배열 데이터를 이용한 반복
배열을 이용한 반복은 다음과 같습니다.
#!/bin/bash
vArray=(A
B
C)
for vItem in "${vArray[@]}"
do
echo $vItem
done
배열을 이용할 때는 아래와 같은 방법으로도 처리할 수 있습니다.
#!/bin/bash
vArray=(A B C)
for vItem in "${vArray[@]}"
do
echo $vItem
done
문자열을 분할하여 반복
입력된 문자열을 분할하여 반복하는 방법도 있습니다. 배쉬쉘에 문자열을 분리할 때 기준이 되는 IFS 변수를 이용하여 처리합니다.
#!/bin/bash
vStrs="John 1 C
David 2 B
Wick 3 A"
IFS=$'\n' # 라인단위로 분리
vArray=($vStrs)
IFS=$' ' # 공백을 기준으로 분리
for vItem in "${vArray[@]}"
do
echo "------"
arr=($vItem)
echo "name=${arr[0]}"
echo "rank=${arr[1]}"
echo "type=${arr[2]}"
done
실행결과는 다음과 같습니다.
$ ./for.sh
------
name=John
rank=1
type=C
------
name=David
rank=2
type=B
------
name=Wick
rank=3
type=A
여러 경로의 데이터를 조회할 때
스크립트를 이용하여 여러 경로의 데이터를 한번에 조회하거나, 다른 처리를 해야 하는 경우가 있습니다. 이럴 때는 아래와 같이 사용합니다.
다음은 vTargetDate
, vTargetHour
를 입력 받거나, 자동으로 설정되어 vLocations
의 여러 경로의 데이터를 aws
커맨드로 조회할 때 사용하는 예제 입니다.
#!/bin/bash
# 사용자가 TargetDate, TargetHour를 입력하지 않으면 자동으로 설정
if [ $# == 3 ]; then
vTargetDate=$1
vTargetHour=$2
else
vTargetDate=`date -d -1hour -u +\%Y\%m\%d`
vTargetHour=`date -d -1hour -u +\%H`
fi
echo "TargetDate: "${vTargetDate}
echo "TargetHour: "${vTargetHour}
# 여러 경로를 한번에 확인할 때
vLocations=(/A/B/C/D/${vTargetDate}/${vTargetHour}/
/A/B/C/D/${vTargetDate}/${vTargetHour}/
/A/B/C/D/${vTargetDate}/${vTargetHour}/)
for vLocation in "${vLocations[@]}"
do
aws s3 ls s3://bucket-name/${vLocation}
done