[Shell] 03. 흐름 제어

Date:     Updated:

카테고리:

태그:


01) if 문



a) 명령 형식

if [ CONDITIONS ]
then
 STATEMENT1
 STATEMENT2
 ....
elif [ CONDITIONS ]
then
 STATEMENT1
 STATEMENT2
 ....
else
 STATEMENT1
 STATEMENT2
 ....
fi


b) 예제

# 01
echo -n "Enter a username to search: "
read NAME

cut -d':' -f1 /etc/passwd | grep -w $NAME > /dev/null

if [ $? -eq 0 ]; then
        echo "$NAME account exits"
else
        echo "$NAME account dose not exits"
fi


# 결과
Enter a username to search: test
test account exits

Enter a username to search: test2
test2 account dose not exits
# 02
# /test 파일시스템에 대해 수요일은 증감 백업 토일은 전체 백업을 실행
DAY=`date +%a`

if [ $DAY == Wed ]; then
        echo "xfsdump -L "" -M "" -l 1 -f /backup/boot_L1_`date +%Y%m%d.dmp` /test"
elif [ $DAY == Sat ]; then
        echo "xfsdump -L "" -M "" -l 0 -f /backup/boot_L1_`date +%Y%m%d.dmp` /test"
fi

# 결과
xfsdump -L  -M  -l 1 -f /backup/boot_L1_202105.dmp /test


02) for 문



a) 명령 형식

for VAR [ in LIST ]
do
    STATEMENT1
    STATEMENT2
done


b) 예제

# 01
for y in `ls *.sh`
do
        ls -l $y
done

# 결과
-rw-r--r--. 1 root root 88 May  3 14:47 name.sh
-rw-r--r--. 1 root root 50 May  5 00:38 test.sh
# 02
# XFS 파일시스템만 찾아 백업
for FSNAME in `df -F xfs | tail -n 2 | cut -f1 -d" "`
do
        echo "xfsdump -M \" \" -L \" \" -l 0 -f /backup/$FSNAME_L0_`date +%Y%m%d`.dump $FSNAME"
done

# 결과
xfsdump -M " " -L " " -l 0 -f /backup/20210503.dump /dev/sda1
xfsdump -M " " -L " " -l 0 -f /backup/20210503.dump /dev/sdc1


03) while 문



a) 명령 형식

while [ CONDITION ]
do
 STATEMENT1
 STATEMENT2
 ....
done


b) 예제

# 01
x=1

while [ $x -le 9 ]
do
        y=1

        while [ $y -le 9 ]
        do
                if [ `expr $x \* $y` -lt 10 ]; then
                        echo -ne "$x x $y = 0`expr $x \* $y`  "
                else
                        echo -ne "$x x $y = `expr $x \* $y`  "
                fi
                y=`expr $y + 1`
        done
        echo
        x=`expr $x + 1`
done


# 결과
1 x 1 = 01  1 x 2 = 02  1 x 3 = 03  1 x 4 = 04  1 x 5 = 05  1 x 6 = 06  1 x 7 = 07  1 x 8 = 08  1 x 9 = 09
2 x 1 = 02  2 x 2 = 04  2 x 3 = 06  2 x 4 = 08  2 x 5 = 10  2 x 6 = 12  2 x 7 = 14  2 x 8 = 16  2 x 9 = 18
3 x 1 = 03  3 x 2 = 06  3 x 3 = 09  3 x 4 = 12  3 x 5 = 15  3 x 6 = 18  3 x 7 = 21  3 x 8 = 24  3 x 9 = 27
4 x 1 = 04  4 x 2 = 08  4 x 3 = 12  4 x 4 = 16  4 x 5 = 20  4 x 6 = 24  4 x 7 = 28  4 x 8 = 32  4 x 9 = 36
5 x 1 = 05  5 x 2 = 10  5 x 3 = 15  5 x 4 = 20  5 x 5 = 25  5 x 6 = 30  5 x 7 = 35  5 x 8 = 40  5 x 9 = 45
6 x 1 = 06  6 x 2 = 12  6 x 3 = 18  6 x 4 = 24  6 x 5 = 30  6 x 6 = 36  6 x 7 = 42  6 x 8 = 48  6 x 9 = 54
7 x 1 = 07  7 x 2 = 14  7 x 3 = 21  7 x 4 = 28  7 x 5 = 35  7 x 6 = 42  7 x 7 = 49  7 x 8 = 56  7 x 9 = 63
8 x 1 = 08  8 x 2 = 16  8 x 3 = 24  8 x 4 = 32  8 x 5 = 40  8 x 6 = 48  8 x 7 = 56  8 x 8 = 64  8 x 9 = 72
9 x 1 = 09  9 x 2 = 18  9 x 3 = 27  9 x 4 = 36  9 x 5 = 45  9 x 6 = 54  9 x 7 = 63  9 x 8 = 72  9 x 9 = 81


04) until 문 - 조건이 거짓일 경우 반복적인 작업



a) 명령 형식

until [ CONDITION ]
do
 STATEMENT1
 STATEMENT2
 ....
done


05) case 문



a) 명령 형식

case EXPRESSION in
PATTERN1)
 statement;;
 statement;;
 ....
PATTERN2)
 statement;;
 statement;;
 ....
*)
 statement;;
 statement;;
 ....
esac


b) 예제

# 01
case $1 in
        start)
                echo "Test service started";;
        stop)
                echo "Test service stop";;
        restart)
                echo "Test service restart";;
        *)
                echo "invalid argument";;
esac
# 02
DATA=`date +%A`

case $DATA in

Monday)
        for FSNAME in `df -F xfs | tail -n 2 | cut -f1 -d" "`
        do
                echo "xfsdump -M "" -L "" -l 1 -f /backup/$FSNAME_L1_`date +%Y%m%d`.dump" $FSNAME
        done;;

Tuesday)
        for FSNAME in `df -F xfs | tail -n 2 | cut -f1 -d" "`
        do
                echo "xfsdump -M "" -L "" -l 2 -f /backup/$FSNAME_L2_`date +%Y%m%d`.dump" $FSNAME
        done;;

Wednesday)
        for FSNAME in `df -F xfs | tail -n 2 | cut -f1 -d" "`
        do
                echo "xfsdump -M "" -L "" -l 3 -f /backup/$FSNAME_L3_`date +%Y%m%d`.dump" $FSNAME
        done;;

Thursday)
        for FSNAME in `df -F xfs | tail -n 2 | cut -f1 -d" "`
        do
                echo "xfsdump -M "" -L "" -l 1 -f /backup/$FSNAME_L1_`date +%Y%m%d`.dump" $FSNAME
        done;;

Friday)
        for FSNAME in `df -F xfs | tail -n 2 | cut -f1 -d" "`
        do
                echo "xfsdump -M "" -L "" -l 2 -f /backup/$FSNAME_L2_`date +%Y%m%d`.dump" $FSNAME
        done;;
Saturday)
        for FSNAME in `df -F xfs | tail -n 2 | cut -f1 -d" "`
        do
                echo "xfsdump -M "" -L "" -l 3 -f /backup/$FSNAME_L3_`date +%Y%m%d`.dump" $FSNAME
        done;;

Sunday)
        for FSNAME in `df -F xfs | tail -n 2 | cut -f1 -d" "`
        do
                echo "xfsdump -M "" -L "" -l 0 -f /backup/$FSNAME_L0_`date +%Y%m%d`.dump" $FSNAME
        done;;
esac

# 결과
xfsdump -M  -L  -l 2 -f /backup/20210503.dump /dev/sda1
xfsdump -M  -L  -l 2 -f /backup/20210503.dump /dev/sdc1


06) select 문



a) 명령 형식

select VAR in LIST
do
 statement1
 statement2
 ...
done


b) 예제

# 01
echo "select a number for excuting command: "
select COMM in ps df ls quit
do
        case $COMM in
        ps)
                ps -ef | head;;
        df)
                df -hF xfs;;
        ls)
                ls -l | head;;
        quit)
                break;;
        *)
                echo "invalid selection"
        esac
done

# 결과
select a number for excuting command:
1) ps
2) df
3) ls
4) quit
#? 1
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 May04 ?        00:00:01 /usr/lib/systemd/systemd rhgb --switched-root --system --deserialize 31
root           2       0  0 May04 ?        00:00:00 [kthreadd]
root           3       2  0 May04 ?        00:00:00 [rcu_gp]
root           4       2  0 May04 ?        00:00:00 [rcu_par_gp]
root           5       2  0 May04 ?        00:00:00 [netns]
root           7       2  0 May04 ?        00:00:00 [kworker/0:0H-events_highpri]
root           9       2  0 May04 ?        00:00:00 [kworker/0:1H-events_highpri]
root          10       2  0 May04 ?        00:00:00 [mm_percpu_wq]
root          12       2  0 May04 ?        00:00:00 [rcu_tasks_kthre]
#? 5
invalid selection
#? 4

BASH 카테고리 내 다른 글 보러가기

댓글 남기기