본문 바로가기

old drawer/programming

[배치파일] 5강 FOR 반복문

고급 배치파일 제 005강 : FOR 반복문
모든 프로그래밍 언어는 흐름형 구조, 제어문 구조, 반복문 구조를 가지고 있습니다.
배치파일에서도 반복문을 쓸 수 있는데 이는 for 문 또는 set /a와 goto문을 응용해서 만들 수 있습니다.

◆ FOR  반복문
[코드]
for   /L   %%변수   in   (시점,증감,종점)   do   (
  [for문 코드]
)  
:: 띄어쓰기 조심하라는 부분은    로 강조하였음, 특히 ) 뒤의 띄어쓰기도 조심

변수 : set변수가 아닌 for문 변수이므로 %변수%가 아닌 %%변수
시점 : for문 반복시 초기 값
증감 : for문 반복할 때 마다 오르는 값
종점 : for문 반복을 마치기 위한 값
for문 코드 : 수행할 코드 입력 (단, set /a에서도 '%%변수'로 써야 함)

1부터 10까지의 합을 구하는 예제를 봅시다.
파일명 : 5-1.bat

@echo off
echo ==============================
echo 배치파일 예제 5-1 - FOR문 반복문
echo ==============================
echo.

set sum=0

for /L %%i in (1,1,10) do (
  echo %%i
  set /a sum+=%%i
)
echo 1부터 10까지의 합 = %sum%
pause>nul

프로그램 분석을 해 보면, 일단 sum에 0의 값을 초기화 시킨 다음
for문에서 %%i는 1부터 1씩 %%i의 값을 변화하면서,
echo를 통해 현재숫자 출력, sum 값에 %%i의 값을 sum에 더하고,
%%i가 10이 될 때까지 하며 그 후, 합계인 sum 값을 출력합니다.
이번에도 역시 마찬가지로 홀수의 합과 짝수의 합을 구해 봅시다.

하지만 아쉽게도 for문에 약간 버그가 있습니다.
저도 왜 이런지 모르겠습니다만 연구 도중
set T=%%i 를 수행하니 T에는 값이 비어 있는거에요...
따라서, FOR문이 제대로 작동이 안될 때에는 약간의 트릭이 필요한데요.

바로 다음과 같이 for문은 한 줄로 쓰듯이, call문을 이용해 약간의 변화를 주면 됩니다.
이게 괄호보다 안정적인 코드가 되었습니다.

[for문 시작 전 수행코드]
for   /L   %%변수   in   (시점,증감,종점)   do   call :FOR레이블 %%변수
[for문 종료 후 수행코드]
:FOR레이블
[for문 내부 수행 코드 구현 (단, for문 변수는 %~1로 처리)]
exit /b   (for문을 2번 이상 쓰는 경우, 필요함)

파일 명 : 5-2.bat
@echo off
echo ==============================
echo 배치파일 예제 5-2 - FOR문 반복문
echo ==============================
echo.
:: 홀수 합과 짝수 합을 구할 변수 준비
set hol=0
set zzak=0

:: for문 실행
for /L %%i in (1,1,10) do call :TempFor %%i

:: 결과 출력
echo 홀수 합 = %hol%
echo 짝수 합 = %zzak%
pause>nul

:: for문 내부 구현
:TempFor

  :: 현재 반복중인 숫자 출력
  echo %~1

  :: 홀짝을 구하기 위해 변수를 2로 나눈 나머지를 저장
  set /a D=%~1 %% 2

  :: 두 if문중에서 만족하는 것에서 해당 연산을 수행 (홀, 짝수 변수에 누적 합을 구함)
  :: 간결한 if문은 goto 문장을 쓰지 않고 한줄에 구현을 할 수도 있음
  if "%D%"=="0" set /a zzak+=%~1
  if "%D%"=="1" set /a hol+=%~1

exit /b


수행 결과
1
2
3
4
5
6
7
8
9
10
홀수 합 = 25
짝수 합 = 30

그리고, C언어 등의 프로그램언어와 마찬가지로 중첩 for문도 쓰실 수 있습니다.
2겹은 물론 ,3, 4, ... 9겹 까지 쓸 수 있습니다.

[for문 시작 전 수행코드]
for   /L   %%a  in   (시점,증감,종점)   do   (
  for   /L   %%b  in   (시점,증감,종점)   do   (
   ...
    call :FOR레이블 %%a %%b ...
   ...
  )
)
[for문 종료 후 수행코드]
:FOR레이블
[for문 내부 수행 코드 구현 (단, for문 변수는 %~1, %~2, ..., %~9로 처리)]
exit /b   (for문을 2번 이상 쓰는 경우, 필요함)

예)

for /L %%i in (1,1,5) do (
  for /L %%j in (1,1,5) do (
    call :TempFor %%i %%j
  )
)
:TempFor
  echo (%~1,%~2)




다음 시간에서는 함수에 대해서 알아 봅시다.