쉘 스크립트 - 2
선택 구조
제어 구조
- 쉘 스크립트에서 실행을 제어하기 위해 선택과 반복 구조를 사용함.
- if, for, case, while, until
if
if command ...; then
command ...
[ elif command; then
command ... ]...
[ else
command ... ]
fi
- ;은 같은 라인에서 다른 단어(then elif else fi)와 구분이 필요할 때 사용함.
- if다음의 명령을 실행하여 참이면 then 다음의 명령을 실행함. (if 명령은 종료됨)
- if나 elif 다음에 조건 검사를 위한 test 명령을 사용할 수 있음.
- if나 elif 다음에 나오는 마지막 명령의 종료 상탯값으로 참과 거짓을 구분함.
- 종료 상탯값 0은 성공적 종료를 의미하며 참으로 간주.
- 거짓이면 elif 다음의 명령을 실행하여 참 / 거짓을 판단하고 실행함.
- 만족 되는 것이 없으면 else 다음의 명령을 실행함.
[ec2-user@ip-AWS ~]$ cd /usr/bin
[ec2-user@ip-AWS bin]$ echo $?
0
[ec2-user@ip-AWS bin]$ cd /bin/usr
-bash: cd: /bin/usr: No such file or directory
[ec2-user@ip-AWS bin]$ echo $?
1
[ec2-user@ip-AWS bin]$ if true; then
> echo "SUCCESS"
> else
> echo "FAILURE"
> fi
SUCCESS
[ec2-user@ip-AWS bin]$ if true; false; then
> echo "TRUE"
> fi
test
- 조건 검사를 위해 사용하는 명령
- 조건이 만족되면 종료 상탯값으로 0(true), 1(false)를 리턴함
- test expression || [ expression ]
- expression은 파일의 상태 검사, 문자열의 비교, 정수 비교를 위한 수식
- **대괄호와 expression 사이에 공백이 있어야 함.
[ec2-user@ip-AWS ~]$ cat intCompare.sh
#! /bin/bash
if [ $# !=2 ]; then
echo "you must supply two numbers as arguments"
exit 1
fi
if [ $1 -eq $2 ]; then
echo "$1 equals to $2"
elif [ $1 -gt $2 ]; then
echo "$1 is greater than $2."
else
echo "$1 is less than $2."
fi
echo "$1 + $2는 $[$1+$2]임."
[ec2-user@ip-AWS ~]$ chmod u+x intCompare.sh
[ec2-user@ip-AWS ~]$ ./intCompare.sh 36 68
./intCompare.sh: line 2: [: 2: unary operator expected
36 is less than 68.
36 + 68는 104임.
case
case word in
[ pattern [ | pattern ]... ) command...;; ]...
esac
- word 부분을 먼저 확장하고 pattern과 매칭되는지 검사함
- 매칭이 이루어지면 상응하는 명령이 수행됨
- 일단 매칭이 이루어지면 이후의 매칭 시도는 없음
- pattern에서 *은 프로그래밍에서 'default 키워드'를 사용함.
case에서 패턴 사용 예
pattern ) |
desc (word가 다음과 같은 경우 패턴 매칭이 일어남) |
a) |
a인 경우 |
[[:alpha:]]) |
1개의 알파벳 문자인 경우 |
???) |
임의의 세 글자인 경우 |
*.txt |
.txt로 끝나는 경우 |
[aeiou]) |
모음에 해당하는 영문 소문자 1개인 경우 |
[ABE][0-9] |
앞 글자가 A, B, E중 하나이고 다음 글자가 숫자인 두 글자인 경우 |
*) |
임의 길이의 글자와 매칭됨. case 명령에서 마지막 패턴으로 사용하는 것이 좋음 |
case 실행의 예
[ec2-user@ip-AWS ~]$ cat caseTest.sh
#!/bin/bash
echo "
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit
"
read -p "Enter selection [a, b, c or q] > "
case $REPLY in
a|A)
echo "Hostname : $HOSTNAME"
uptime
;;
b|B)
df -h
;;
c|C)
if [$( id -u) -eq 0 ]; then
echo "All user's home disk space utillization"
du -sh /home/*
else
echo "($USER)' home disk space utilization"
du -sh $HOME
fi
;;
q|Q)
echo "Program terminated."
exit
;;
*)
echo "Invalid entry" > $2
exit 1
;;
esac
[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit
Enter selection [a, b, c or q] > a
Hostname : ip-AWS.ap-northeast-2.compute.internal
07:45:43 up 34 days, 0 min, 1 user, load average: 0.00, 0.00, 0.00
[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit
Enter selection [a, b, c or q] > b
Filesystem Size Used Avail Use% Mounted on
devtmpfs 474M 0 474M 0% /dev
tmpfs 492M 0 492M 0% /dev/shm
tmpfs 492M 408K 492M 1% /run
tmpfs 492M 0 492M 0% /sys/fs/cgroup
/dev/xvda1 8.0G 1.9G 6.2G 24% /
tmpfs 99M 0 99M 0% /run/user/1000
[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit
Enter selection [a, b, c or q] > c
./caseTest.sh: line 19: [1000: command not found
(ec2-user) home disk space utilization
92K /home/ec2-user
[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit
Enter selection [a, b, c or q] > d
./caseTest.sh: line 30: $2: ambiguous redirect
[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit
Enter selection [a, b, c or q] > g
./caseTest.sh: line 30: $2: ambiguous redirect
[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit
Enter selection [a, b, c or q] > q
Program terminated.
반복 구조
for
[ec2-user@ip-AWS ~]$ echo {A..D}
A B C D
[ec2-user@ip-AWS ~]$ for i in {A..D}; do echo $i; done
A
B
C
D
[ec2-user@ip-AWS ~]$ cat testFor.sh
#! /bin/bash
for FILE
do
echo $FILE
done
[ec2-user@ip-AWS ~]$ chmod u+x testFor.sh
[ec2-user@ip-AWS ~]$ ./testFor.sh `ls`
arg.sh
caseTest.sh
first.sh
intCompare.sh
list.bak
testFor.sh
whoson.sh
C나 Java에서 사용하는 형태
for (( exp1; exp2; exp3 )); do
command...
done
exp1~3은 수식으로 각각 생략 가능
exp1은 제어 변수의 초기화를 위해 한 번 수행 됨
exp2가 참인 동안 명령과 exp3이 반복 수행 됨
[ec2-user@ip-AWS ~]$ cat testFor3.sh
#! /bin/bash
LIMIT=10
for(( a=0; a<LIMIT; a++)); do
echo "$a"
done
[ec2-user@ip-AWS ~]$ . testFor3.sh
0
1
2
3
4
5
6
7
8
9
[ec2-user@ip-AWS ~]$
while
[ec2-user@ip-AWS ~]$ cat testWhile.sh
#! /bin/bash
N=1
S=0
while [ $N -le 10 ]; do
echo -n "$N "
S=$[ $S+$N ]
N=$[ $N+1 ]
done
echo
echo $S
[ec2-user@ip-AWS ~]$ . testWhile.sh
1 2 3 4 5 6 7 8 9 10
55
for 와 while
[ec2-user@ip-AWS ~]$ cat testWhile2.sh
#! /bin/bash
LIMIT=10
((a=0))
while (( a<LIMIT )); do
echo "$a"
(( a++ ))
done
[ec2-user@ip-AWS ~]$ . testWhile2.sh
0
1
2
3
4
5
6
7
8
9
until
[ec2-user@ip-AWS ~]$ cat testUntil.sh
#! /bin/bash
N=1
S=0
until [ $N -gt 10 ]; do
echo -n "$N "
let S=$S+$N
let N=$N+1
done
echo
echo $S
[ec2-user@ip-AWS ~]$ . testUntil.sh
1 2 3 4 5 6 7 8 9 10
55