3.for

출처

설명

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

links

social