[Shell] 03. 흐름 제어
카테고리: BASH
태그: bash
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
댓글 남기기