쉘 스크립트 - 2
학습 개요
쉘 스크립트에서 선택과 반복을 위한 제어 구조를 사용해보자.
선택 구조인 if / case, 반복 주조인 for / while / until 명령의 문법과 의미를 알아 보자.
조건 검사가 필요할 때 사용되는 명령과 수식의 작성법을 알아 보자.학습 목표
- 선택 구조를 사용하여 쉘 스크립트를 작성하자.
- 반복 구조를 사용하여 쉘 스크립트를 작성하자.
- 수식을 포함하는 쉘 명령을 선택과 반복 구조에서 사용하자.
선택 구조
제어 구조
- 쉘 스크립트에서 실행을 제어하기 위해 선택과 반복 구조를 사용함.
- if, for, case, while, until
if
- 프로그래밍 언어에서 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
- 다중 선택을 지원하는 복합 명령
- switch 문과 비슷
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
- 모든 데이터를 한 차례씩 처리하는 제어구조
for variable [ in word ... ]; do command ... done
- word ... 부분 (값의 목록)을 먼저 확장함
- word 목록에 존재하는 값을 순차적으로 변수 variable에 대입하고 do와 done 사이의 명령을 수행함.
- word 부분이 없다면 in "$@"가 있는 것으로 가정함.
[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
- 조건이 참인 동안 명령을 반복함.
while command...; do command done
- while 다음에 나오는 명령을 실행하여 참 또는 거짓을 판단함
- if 명령과 마찬가지로 종료 상탯값이 0이면 참으로 판단
- 조건 비교를 위해 test expression 또는 [ expression ]을 자주 사용함.
[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
- for 명령 (2)를 다음과 같이 변환 가능
(( exp1 )) while (( exp2 )); do command... (( exp3 )) done
- (( expression ))은 수식 계산에 사용되는 복합 명령
- let "expression"과 동일하며 test 명령 대신에 사용 가능
- 조건 비교를 위해 test expression 또는 [ expression ]과 함께 자주 사용함.
- while 다음의 (( expression ))에서 수식 결과가 0이 아닌 경우 종료 상탯값이 0이 되며 참으로 판단.
[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
- 조건이 만족될 때까지(거짓인 동안) 명령을 반복하여 수행함
until command ... ; do command ... done
- until 다음에 나오는 명령이 참이 될 때까지 반복함
- 거짓인 동안 반복하게 됨
- 조건을 표시하기 위해 test expression, [ expression ], (( expression ))을 사용할 수 있음.
[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
728x90
반응형
'OS > Linux' 카테고리의 다른 글
[Linux] 원격 관리 (0) | 2020.12.13 |
---|---|
[Linnux] 네트워크 설정 및 점검 (0) | 2020.12.05 |
[Linux] 소프트웨어 관리 (0) | 2020.11.01 |
[Linux] 프로세스 관리 (0) | 2020.11.01 |
[Linux] 파일 시스템 관리 (0) | 2020.10.25 |