본문 바로가기
IT 지식정리/운영체제

[Linux shell script 11] 리눅스 쉘스크립트: for 사용법 2015. 2. 13.

by G. Hong 2017. 11. 4.
728x90
반응형

리눅스의 쉘스크립트에서 중요한 흐름제어 중 하나인 for를 사용하는 방법에 대해서 알아보도록 하겠습니다.


이번엔 for 문장에 대해서 알아보겠습니다.


기본적인 사용법은 아래와 같습니다.

for variable in words; do

    commands

done

사용법만 가지고는 이해가 잘 안되는데, 아래는 가장 기본적인 구조의 스크립트입니다.

변수 i에 word1,word2,word3이 순차적으로 들어간다고 보시면 됩니다.

#!/bin/bash


for i in word1 word2 word3; do

    echo $i

done


아래의 예제 스크립트들과 결과를 보시면 더 잘 이해가 되시리라 생각됩니다.

ls의 결과로 나오는 값들이 순차적으로 i값이 되어 출력되는 스크립트입니다.

$cat t_for

#!/bin/bash


for i in $(ls); do

    echo $i

done


$./t_for

t_for

t_position

t_sel

t_until

t_while


포지션 값들이 순차적으로 i값이 되어 출력되는 스크립트입니다.

$cat t_for

#!/bin/bash


for i in "$@"; do

    echo $i

done


$./t_for a b c d abc

a

b

c

d

abc


현재 있는 디렉토리의 파일이름들이 순차적으로 i값이 되어 출력되는 스크립트입니다.

$cat t_for

#!/bin/bash


for i in *; do

    echo $i

done


$vi t_for

$./t_for

t_for

t_position

t_sel

t_until

t_while


잘 이해가 되셨나 모르겠습니다.. ㅡㅡ;;

아래에는 for문을 이용하여서 2개의 txt파일 내용이 같은지 비교하는 스크립트를 만들어 보았습니다.

코드에 대해서는 주석으로 설명을 적었습니다.

$cat t_for

#!/bin/bash


# 잘못된 command가 입력되었을 때, 출력되는 함수

usage(){

        echo "usage : t_for file_1 file_2"

}


# 2개의 파일이름이 입력되지 않았을 때, 실행되는 부분

if [ "$#" != "2" ]; then

        echo "syntax error!"

        usage

        exit 1

fi


# i 와 j 는 몇 번째 단어를 비교할 것 인지를 결정

i=0

for word1 in $(cat $1); do

        j=0

        for word2 in $(cat $2); do

                if [ $((i)) = $((j)) ]; then

# 같은 번째의 단어가 다르게 되면 메세지 출력 후 종료

                        if [ $word1 != $word2 ]; then

                                echo "The contents are not same between 2 files!"

                                exit 1

                        fi


                fi

                j=$((j+1))

        done

        i=$((i+1))

done

# 끝까지 종료되지 않으면 두 파일의 내용이 같은 것 으로 결론

echo "The contens in the 2 files are same!"


txt1,txt2,txt3 3개의 파일을 만든 뒤 txt1,txt3은 같은 내용을 저장하였습니다.

$ls -al

total 44

.....

-rw-rw-r--. 1 gyhong gyhong   26 Feb 13 16:27 txt1

-rw-rw-r--. 1 gyhong gyhong   30 Feb 13 16:35 txt2

-rw-rw-r--. 1 gyhong gyhong   26 Feb 13 16:35 txt3


실행을 하였을 때, 아래와 같이 원하는 출력이 나왔습니다.

$./t_for txt1 txt2

The contents are not same between 2 files!

$./t_for txt1 txt3

The contens in the 2 files are same!

$./t_for txt1

syntax error!

usage : t_for file_1 file_2


여기에다가 입력한 파일이 존재하지 않을 경우의 메세지도 추가하면 더 좋을 것 같습니다.


728x90
반응형