본문 바로가기
IT일반/Linux

Command Line - 흐름 제어 : for 루프

by 버섯도리 2022. 6. 13.
[cmd_test@btjeon-naver ~]$ for i in A B C D; do echo $i; done
A
B
C
D
[cmd_test@btjeon-naver ~]$ for i in {A..D}; do echo $i; done
A
B
C
D
[cmd_test@btjeon-naver ~]$ for i in distros*.txt; do echo $i; done
distros-bydate.txt
distros-dates.txt
distros-key-names.txt
distros-key-vernums.txt
distros-names.txt
distros.txt
distros-vernums.txt
distros-versions.txt

for 문 사용 예

 

[cmd_test@btjeon-naver ~]$ vi longest_word.sh
--------------------------------------------------------------------------------------------
#!/bin/bash

# longest-word : find longest string in a file

while [[ -n $1 ]]; do
        if [[ -r $1 ]]; then
                max_word=
                max_len=0
                for i in $(strings $1); do
                        len=$(echo $i | wc -c)
                        if (( len > max_len )); then
                                max_len=$len
                                max_word=$i
                        fi
                done
                echo "$1: '$max_word' ($max_len characters)"
        fi
        shift
done
--------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./longest_word.sh ls-output.txt 
ls-output.txt: 'abrt-action-check-oops-for-hw-error' (36 characters)

하나 이상의 파일명이 주어질 때 각 파일 내의 가장 긴 문자열을 검색하는 예제. 각 파일마다 읽을 수 있는 텍스트 단어들의 목록을 생성하기 위해 strings 프로그램을 사용한다.

 

[cmd_test@btjeon-naver ~]$ vi longest_word2.sh
-------------------------------------------------------------------------------------------
#!/bin/bash

# longest-word2 : find longest string in a file

for i; do
        if [[ -r $i ]]; then
                max_word=
                max_len=0
                for j in $(strings $i); do
                        len=$(echo $j | wc -c)
                        if (( len > max_len )); then
                                max_len=$len
                                max_word=$j
                        fi
                done
                echo "$i: '$max_word' ($max_len characters)"
        fi
done
-------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./longest_word2.sh ls-output.txt 
ls-output.txt: 'abrt-action-check-oops-for-hw-error' (36 characters)
[cmd_test@btjeon-naver ~]$ ./longest_word2.sh distros.txt patchfile.txt 
distros.txt: '12/07/2006' (11 characters)
patchfile.txt: '11:25:30.231835775' (19 characters)

for 명령의 words 부분이 생략되면, for는 위치 매개변수를 기본으로 처리한다. shift의 사용도 제거되었다.

 

[cmd_test@btjeon-naver ~]$ vi simple_counter.sh
--------------------------------------------------------------------------------------------
#!/bin/bash

# simple_counter : demo of C style for command

for (( i=0; i<5; i=i+1)); do
        echo $i
done
--------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ mv smile_counter.sh simple_counter.sh
[cmd_test@btjeon-naver ~]$ ./simple_counter.sh 
0
1
2
3
4

for 문의 다른 형식 예제 (C 언어 스타일)

 

더보기

for 문 활용하여 report_home_space 함수에서 각 사용자 홈 디렉토리에 대한 자세한 정보와 파일 및 하위 디렉토리 정보를 포함하게끔 수정

[cmd_test@btjeon-naver ~]$ vi sys_info_page_here4
----------------------------------------------------------------------------------------------
#!/bin/bash

# sys_info_page: Program to output a system information page

PROGNAME=$(basename $0)
TITLE="System Information Report for $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %Z")
TIME_STAMP="Generated $CURRENT_TIME, by $USER"

report_uptime() {
        cat <<- _EOF_
                <H2>System Uptime</H2>
                <PRE>$(uptime)</PRE>
                _EOF_
        return
}

report_disk_space() {
        cat <<- _EOF_
                <H2>Disk Space utilization</H2>
                <PRE>$(df -h)</PRE>
                _EOF_
        return
}

report_home_space() {
        local format="%8s%10s%10s\n"
        local i dir_list total_files total_dirs total_size user_name

        if [[ $(id -u) -eq 0 ]]; then
                dir_list=/home/*
                user_name="All Users"
        else
                dir_list=$HOME
                user_name=$USER
        fi

        echo "<H2>Home Space Utilization ($user_name)</H2>"

        for i in $dir_list; do
                total_files=$(find $i -type f | wc -l)
                total_dirs=$(find $i -type d | wc -l)
                total_size=$(du -sh $i | cut -f 1)
                echo "<H3>$i</H3>"
                echo "<PRE>"
                printf "$format" "Dirs" "Files" "Size"
                printf "$format" "----" "-----" "----"
                printf "$format" $total_dirs $total_files $total_size
                echo "</PRE>"
        done
        return
}

usage() {
        echo "$PROGNAME: usage: $PROGNAME [-f file | -i]"
        return
}

write_html_page() {
        cat <<- _EOF_
        <HTML>
                <HEAD>
                        <TITLE>$TITLE</TITLE>
                </HEAD>
                <BODY>
                        <H1>$TITLE</H1>
                        <P>$TIME_STAMP</P>
                        $(report_uptime)
                        $(report_disk_space)
                        $(report_home_space)
                </BODY>
        </HTML>
        _EOF_
        return
}

# process command line options

interactive=
filename=

while [[ -n $1 ]]; do
        case $1 in
                -f | --file)            shift
                                        filename=$1
                                        ;;
                -i | --interactive)     interactive=1
                                        ;;
                -h | --help)            usage
                                        exit
                                        ;;
                *)                      usage >&2
                                        exit 1
                                        ;;
        esac
        shift
done

# interactive mode

if [[ -n $interactive ]]; then
        while true; do
                read -p "Enter name of output file: " filename
                if [[ -e $filename ]]; then
                        read -p "'$filename' exists. Overwrite? [y/n/q] > "
                        case $REPLY in
                                Y|y)    break
                                        ;;
                                Q|q)    echo "Program terminated."
                                        exit
                                        ;;
                                *)      continue
                                        ;;
                        esac
                elif [[ -z $filename ]]; then
                        continue
                else
                        break
                fi
        done
fi

# output html page

if [[ -n $filename ]]; then
        if touch $filename && [[ -f $filename ]]; then
                write_html_page > $filename
        else
                echo "$PROGNAME: Cannot write file '$filename'" >&2
                exit 1
        fi
else
        write_html_page
fi
----------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./sys_info_page_here4
<HTML>
<HEAD>
<TITLE>System Information Report for btjeon-naver</TITLE>
</HEAD>
<BODY>
<H1>System Information Report for btjeon-naver</H1>
<P>Generated 06/16/2022 06:26:02 AM KST, by cmd_test</P>
<H2>System Uptime</H2>
<PRE> 06:26:02 up 32 days, 13:39,  1 user,  load average: 0.00, 0.01, 0.05</PRE>
<H2>Disk Space utilization</H2>
<PRE>Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        481M     0  481M   0% /dev
tmpfs           491M     0  491M   0% /dev/shm
tmpfs           491M   56M  435M  12% /run
tmpfs           491M     0  491M   0% /sys/fs/cgroup
/dev/xvda1       50G  2.4G   48G   5% /
tmpfs            99M     0   99M   0% /run/user/0</PRE>
<H2>Home Space Utilization (cmd_test)</H2>
<H3>/home/cmd_test</H3>
<PRE>
    Dirs     Files      Size
    ----     -----      ----
     216      5363      5.9M
</PRE>
</BODY>
</HTML>

 

 

 

 

 

 

 

출처 : 리눅스 커맨드라인 완벽 입문서

 

'IT일반 > Linux' 카테고리의 다른 글

Command Line - 배열  (0) 2022.06.18
Command Line - 문자열과 수  (0) 2022.06.17
Command Line - 위치 매개변수  (0) 2022.06.08
Command Line - 흐름 제어 : Case 분기  (0) 2022.06.07
Command Line - 문제 해결  (0) 2022.06.06