UNIX 시스템

Loop - 12주차 수업 - 2 (실습 3-2 질문)

세인트킴 2023. 6. 1. 20:10

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진수로 간주함을 의미한다.