리눅스

쉘 프로그래밍 [루프문 for]

작성자
heukchoo
작성일
2021-01-18 00:02
조회
701
드디어 프로그래밍의 꽃인 루프문이다.

루프문에는 for, while, untill 등 다양한 문법이 있지만 가장 많이 사용되는 for 문만 설명한다.
(for 문 하나로도 충분하다.)


seq 명령어


for 문 시작에 앞서 seq 명령을 설명한다.

쉘 프로그래밍에서 for 문을 사용할 때 seq 명령을 자주 사용하게 된다.


seq 명령은 숫자를 순차적으로 생성하여 출력한다.
$seq 2
1
2

$seq 2 4
2
3
4

$seq 1 2 5
1
3
5

$seq -s "+" 1 3
1+2+3


seq 뒤에 숫자를 하나만 쓰면 1부터 해당 숫자까지 순차적으로 출력한다.

seq 뒤에 숫자를 두개 쓰면 앞을 숫자에서 뒤의 숫자까지 순차적으로 출력한다.

seq 뒤에 숫자를 세개 쓰면 처음 숫자에서 마지막 숫자까지 가운데 숫자 간격으로 순차적으로 출력한다.

-s 옵션을 사용하면 출력되는 숫자 사이의 구분자를 지정할 수 있다.
(for 문에서 사용될 일은 없다.)


그럼 for 문 설명을 시작한다.


루프문 구조1


for 변수 in 입력값
do

명령어

done
다수의 입력값을 변수로 받으면서 입력값 개수 만큼 명령어
를 반복 실행한다.


입력값은 직접 값을 입력해도 되고, 명령어를 사용해도 된다.


루프문 구조1 예시


loop1.p 스크립트

#!/bin/bash

for i in `seq 3`
do

echo $i

done


$./loop1.p
1
2
3

변수 i를 선언함과 동시에 seq 명령을 사용해서 1부터 3까지의 값을 순차적으로 생성하여 변수에 입력하였다.

위의 방식은 생성한 값을 명령어에서 활용해도 되지만, 별개의 명령을 3회 반복하는 용도로 사용해도 된다.

seq 명령을 실행하기 위해 따옴표(숫자1 좌측 키)를 사용했음을 유의하자.


loop2.p 스크립트

#!/bin/bash

for i in `cat 파일.txt`
do

echo $i

done



파일.txt

heuk choo
good


$./loop2.p
heuk
choo
good

파일을 읽어 루프를 돌릴 수도 있다.

cat 명령은 파일을 읽어 출력하는 명령이다.

'파일.txt'를 읽어 변수 i에 전달하였고 '파일.txt'에 있던 세 단어가 순차적으로 출력되었다.

주목할 것은 파일에 공백으로 구분된 단어가 하나씩 변수에 전달되었다는 것이다.


만일 공백으로 구분된 단어가 아니라 행 하나하나를 변수로 받고 싶을 경우 IFS를 사용해야 한다.(나름 고급 정보이다.^^)
$IFS_BK=$IFS

$IFS='
'

$./loop2.p
heuk choo
good

$IFS=$IFS_BK

동일한 스크립트와 파일로 위와 같이 실행하면 행 하나하나를 변수로 사용한다.

IFS는 단어 구분자를 담고있는 쉘의 환경변수이다.(기본적으로 공백)

이것을 함부로 변경하면 다시 돌리기 어려우므로(사실 시스템을 리부트 하면된다.) IFS_BK(임의의 변수)에 IFS 내용을 백업하였다.

그리고 IFS 변수에 작은 따옴표('')을 이용해 개행값(Enter 키)을 저장하였다.
(IFS=$'\n' 형식으로 개행문자를 입력해도 된다.)

이제 IFS는 행의 끝을 나타내는 개행값이 입력되었고 for 문의 변수는 행 한줄씩 변수로 받는다.

중요한 것은 for 문 동작을 한 후에 반드시 IFS의 원래값을 복원하여야 한다.
(처음 백업해 두었던 IFS_BK 변수값을 IFS 변수에 입력)

위의 과정은 설명을 위해 명령 프롬프트에서 작성했지만 스크립트에 넣어서 돌려도 된다.


루프문 구조2


for ((변수선언;조건;변수증감))
do

명령어

done

C언어에서 자주보는 형식이다.

예시를 보면 쉽게 이해될 것이다.


루프문 구조2 예시


loop3.p 스크립트

#!/bin/bash

for (( i=0 ; i < 3 ; i++ ))
do

echo $i

done


$./loop3.p
0
1
2

변수 i를 선언함과 동시에 0으로 초기화 하였다.

세미콜론(;)으로 구분한 두번째 칸에는 변수 i가 3보다 작을 때까지라는 조건을 걸었다.

세번째 칸에는 변수 i가 1씩 증가하도록 하였다.
(2씩 증가하도록 하려면 i=i+2 라고 명시하면 된다.)

따라서 변수 i는 0, 1, 2 값을 순차적으로 전달 받으며 명령을 3회 실행한다.


만약 무한루프를 돌리고 싶으면 다음과 같이 for 문을 작성하면 된다.

loop4.p 스크립트

#!/bin/bash

for (( ;; ))
do

echo heukchoo

done


$./loop4.p
heukchoo
heukchoo
.
.

echo 명령에 의해 heukchoo가 무한히 출력된다.

강제로 종료하고 싶으면 Ctrl+c 를 누르면 된다.


한가지 첨언으로 앞서 소개한 seq를 사용하면 편한데 굳이 위의 방식을 써야하는 이유를 설명한다.

seq 명령으로 생성된 숫자는 모두 메모리에 저장된다.

따라서 많은 루프를 돌릴 경우 seq 명령을 사용하면 메모리 낭비가 발생하여 위의 조건을 사용한 방법이 훨씬 효율적이다.

사실 요즘 하드웨어에서는 몇 천, 몇 만개의 루프도 괜찮지만 조금이라도 낭비를 줄이는 습관이 좋은 프로그램을 만드는 길이기도 하다.


이제 루프문까지 정리되었다.

지금까지 설명한 변수, 조건문, 루프문을 응용하면 기본적인 프로그래밍이 가능하다.

다음에는 프로그래밍에 필요한 몇가지 문법과 리눅스의 기본 명령어를 소개한다.
전체 0