Loop - 12주차 수업 - 2 (실습 3-2 질문)
Loop - while
while [expresiion]
do
statements
done
while 예
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]
do
echo The counter is $COUNTER
let COUNTER=COUNTER+1
done
연관있는 연산자 - Relational Operator | |
lt | less than |
gt | greater than |
le | less than to equal to |
ge | greater than or equal to |
eq | equal to |
ne | not equal to |
산술평가 - Arithmetic Evaluation | |
let | 산술식의 평가 |
산술평가 - Arithmetic Evalution
산술평가 let 예시
b=1+1
let a=1+1
echo $b=$a
1+1=2
이중 소괄호(double parantheses)사용
echo $(1+1) // 이중 괄호 안을 평가(반환 값 있음)
((a=1+1)) // 이중 괄호 안을 평가(반환 값 없음)
echo $a
Loop - until
until [ expression ]
do
statements
done
until 예
#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]
do
echo The counter is $COUNTER
done
break와 continue
for, while, until 같은 loop문은 break문을 만나면 루프를 빠져나온다. continue문을 만나면 다음 반복으로 이동한다.
break, continue 예
Break
#!/bin/bash
COUNTER=0
while true
do
let COUNTER=COUNTER+1
if [ $COUNTER -gt 20 ]; then
break;
fi
echo $COUNTER
done
Continue
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 20 ];
do
let COUNTER=COUNTER+1
if [ $COUNTER -eq 10 ]; then
countinue;
fi
echo $COUNTER
done
read
#!/bin/bash
echo "Please enter your first name and last name
read FN LN
echo "Hi!, $FN $FN
case
#!/bin/bash
echo "아무 키나 누른 다음 리턴을 치시오."
read Keypress
case "$Keypress" in
[a-z] ) echo "소문자";;
[A-Z] ) echo "대문자";;
[0-9] ) echo "숫자";;
* ) echo "구두점이나, 공백문자 등등";;
esac
select
#!/bin/bash
OPTION="Hello Quit"
select opt in $OPTION
do
if [ $opt = Quit ]; then
echo done
exit
elif [ $opt = Hello ]; then
echo Hello World
else
clear
echo Bad option
fi
done
실습1(while)
1부터 20까지 숫자를 출력하는 프로그램을 작성하시오(while문과 산술식 let 이용)
#!/bin/bash
COUNTER=0
while [ $COUNTER -le 20 ]
do
let COUNTER=COUNTER+1
echo The counter is $COUNTER
done
실습2(while, read)
사용자로부터 정수 n을 입력받고, 1부터 해당 숫자까지 합을 계산하여 출력하는 프로그램을 작성하시오(while 이용)
#!/bin/bash
read n
i=1
sum=0
while [ $i -le $n ];
do
let sum=sum+i
let i+=1
done
echo $sum
실습3(for, if)
다음 쉘프로그램을 실행해본다.
#!/bin/bash
for line in $(who)
do
echo $line
done
1-1. 출력결과가 원래의 who 출력과 차이가 나는 이유가 무엇인가?
'$()'는 명령어를 실행하고 결과를 가져오는 서브쉘 구문이다. 따라서 $(who)명령은 현재 사용자의 로그인 정보를 가져오는게 아니라 쉘에서 실행되는 who 명령의 결과를 가져온다. 원래의 who 명령어는 사용자 정보를 줄 단위로 출력하고 각 줄에 필드가 정렬되어 있다. $()는 스크립트인데 여기서는 단어 단위로 출력되기 때문에 형식이 달라지는 것이다.
1-2. 단어 구분자로 줄바꿈 문자(\n)를 지정하기 위해 첫줄에 다음을 넣으시오 - IFS(Internal Field Separator)
#!/bin/bash
IFS=$`\n`
for line in $(who)
do
echo $line
done
2. 현재 로그인되어 있는 사용자만 시각과 함께 출력하는 프로그램 wtoday를 작성하시오.
#!/bin/bash
who | while read line //변수 line에다가 who 명령을 저장한다.
do
id=$(echo $line | tr -s ' ' | cut -f1 -d ' ')
time=$(echo $line | tr -s ' ' | cut -f4 -d ' ')
echo "$id님 오늘 $time에 들어오셨군요!"
done
실습4(산술식 계산)
1. last 명령을 수행해본다. 어떤 기능인가?
last명령은 마지막으로 로그인했던 기록을 보는 명령어이다.
2. last명령에서 자신의 id 기록만 보려면?
last 202121165
20212116 pts/598 112.148.136.34 Fri Jun 2 13:30 still logged in
20212116 pts/596 112.148.136.34 Fri Jun 2 12:01 - 14:40 (02:38)
20212116 pts/599 121.191.175.163 Thu Jun 1 19:57 - 23:35 (03:38)
20212116 pts/599 112.216.247.246 Thu Jun 1 14:50 - 14:54 (00:03)
3. 이번 달 로그인 기록에서 자신의 id에 대해 사용시간 부분만 잘라 출력한다.
last 202121165 | tr -s ' ' | cut -f10 -d ' ' | grep -v 'in'
(02:38)
(03:38)
(00:03)
4. 반복문과 산술식 계산을 통해 자신의 id의 이번 달 총 사용시간을 출력하는 프로그램 mylog을 작성한다.
쉘에서 첫째 자리가 0인 경우, 8진수로 간주됨에 유의, 변수 H에 있는 내용을 10진수로 간주하도록 하고 싶다면 다음과 같은 문장을 통해 변환한다. H=$(10#$H) - 10#은 변수 H를 10진수로 간주함을 의미한다.