728x90
반응형

안녕하세요, 


아래 모집했던 쉘스크립트 스터디가 이제 3주차까지 진행이 되었습니다. (저번주에만 한주 쉬었네요 ^^;)
스터디원분들이 업무 특성상 교대 근무하시는 분들이 많아서 항상 다 모이기가 쉽지 않기 때문에 
매주 스터디 내용을 공유하는 차원에서 이 곳에 스터디 내용을 정리해서 올리려고 합니다. 
저희 스터디 내용에 관심 있으신 분들도 한번 보시고 궁금하신 점이나 추가/조언해주실 내용이 있다면 댓글 부탁 드립니다~


1. 본쉘스크립트 간단 문법/주의사항 정리
  - 스크립트 파일 이름은 보통 *.sh 로 명명함
  - sh 파일의 첫 라인은 #!/bin/sh 로 시작
  - 스크립트 파일의 실행은 sh ./filename.sh 와 같이함
  - 스크립트 파일 내에서 # 은 주석을 나타냄
  - 일반변수에 값을 대입 시 = 양 옆에 빈칸이 없어야 함 (var=0)
  - 변수의 값을 가져올 시 앞에 $을 붙임 (ex. $var) / 변수에 값을 대입시에는 $을 붙이지 않음 
  - if [ 조건식 ] then 실행할 내용 else 실행할 내용 fi
  - if [ 조건식1 ] then 실행할 내용 elif [ 조건식 2] then 실행할 내용 else 실행할 내용 fi
  - while [ 조건식 ] do 실행할 내용 done
  - 문자열 비교는 !=, == 사용
  - 숫자 비교는 -gt (greater than), -eq (equal than), -lt (less than) 사용
  - if / while 문의 [ 조건식 ] 에서 대괄호 안의 조건식 양옆에 공백을 두어야 함 
  - 리눅스 명령어의 실행 결과값을 가져오려면 백쿼터 안에 넣어야함(ex. `명령어`, 주의:따옴표가 아님!)


2. 본쉘 문법 예제  
  - 리눅스 시스템 명령어를 사용하지 않고, 순수하게 본쉘 문법만을 학습하기 위한 예제를 함께 논의하여 작성

2-1.  가위바위보 게임
조건 : 1:가위, 2:바위, 3:보로 지정, 컴퓨터는 바위를 낸다고 가정함
입력 : 1 ~ 3 사이의 숫자 하나
출력 : 비겼을 시 "draw / 이겼을 시 "win" / 졌을 시 "lose" 출력
 

#!/bin/sh

 

read yours

 

if [ $yours -eq 2 ]

then

echo "draw"

elif [ $yours -eq 1 ]

then 

echo "lose"

else

echo "win"

fi


2-2. 숫자 맞추기
조건 : 맞출 숫자를 하나 정하고, 그 숫자를 맞추기 위해 반복으로 숫자를 입력 받음
입력 : 맞춰야할 숫자 입력 (Input a Number : )
추측한 숫자 (Guess : )
출력 : 추측한 숫자가 맞출 숫자보다 큰 경우 "Big" 출력 / 작은 경우 "Small" 출력 / 맞춘 경우 "OK" 출력
 #!/bin/sh

 

echo "Input a Number: "

read number

 

echo "Guess : "

read guess

 

while [ $number -ne $guess ]

do

if [ $number -gt $guess ]

then

echo "Big"

else

echo "Small"

fi

 

echo "Guess : "

read guess

done

 

echo "Ok"


2.3 숫자야구
조건 : 0 또는 1의 임의의 값을 생성하고, 0~1의 숫자를 입력받아서 임의로 생성한 숫자와 일치시 "Strike" / 아니면 "Ball" 출력
종료조건 : 3 Strike or 4 Ball 이 되었을 시 종료. 3 Strike 라면 "Out" / 4 Ball 일 시 "Win" 출력
 

#!/bin/sh

 

strike_count=0

ball_count=0

 

while [ $strike_count -lt 3 -a $ball_count -lt 4 ]

do

pitch=`rand -M 2`

echo "Guess : "

read guess

 

echo "Pitch : $pitch"

 

if [ $guess -eq $pitch ]

then

echo "STRIKE!"

strike_count=`expr $strike_count + 1` 

else

echo "BALL!"

ball_count=`expr $ball_count + 1` 

fi

 

echo "[Strike: $strike_count / Ball: $ball_count]"

done

 

if [ $strike_count -ge 3 ]

then

echo "OUT"

else

echo "WIN"

fi


 - 다른 방법
 

#!/bin/bash

 

strike=0

ball=0

cond=0

 

while [ $cond -eq 0 ]

do

pitch=`rand -M 2`

echo "enter: "

read num

 

if [ $pitch -eq $num ]

then

echo "strike!"

strike=`expr $strike + 1`

if [ $strike -eq 3 ]

then

echo "OUT"

cond=1

fi

else

echo "ball"

ball=`expr $ball + 1`

if [ $ball -eq 4 ]

then

echo "WIN"

cond=1

fi

fi

done



3. 본쉘 스크립트 활용
  - 리눅스 명령어를 활용하여 간단한 스크립트를 작성

3.1 파일에서 문자열 찾기
조건 : 파일명과 찾을 문자열을 입력 받아서 해당하는 문자열이 파일 내에 있을 경우 "OK" / 없다면 "NOT FOUND" 출력

#!/bin/sh

 

usage="usage: ./findstr.sh filename string"

 

if [ $# -ne 2 ]  

then

echo $usage

else

find=`grep -c -i $2 $1`

if [ $find -gt 0 ]

then

echo "OK"

else

echo "NOT FOUND"

fi

fi 

3.2 디렉토리내의 파일(*.txt)에서 특정 문자열을 포함한 파일 찾기
조건 : 디렉토리와 찾을 파일명을 입력 받아서 해당 디렉토리 내의 txt 파일에서 찾을 문자열을 가진 파일이 있을 경우 해당
파일명 출력 / 없을 경우 "NOT FOUND" 출력
 

#!/bin/sh

 

not_found=0

usage="usage: ./findstrindir directory string"

 

if [ $# -ne 2 ]  

then

echo $usage

else

for filename in `find $1 -name "*.txt"`

do

find_cnt=`grep -c $2 $filename`

if [ $find_cnt -gt 0 ]

then

not_found=1

echo `basename $filename`

fi

done

 

if [ $not_found -eq 0 ]

then

echo "NOT FOUND"

fi

fi


3.3 현재 풀더에 생성된지 1분이 지난 파일이 있는지 확인
조건 : 현재 폴더에서 생성된지 1분이 지난 파일이 있는지 검사하여 존재 시 "YES" / 없다면 "NO" 출력
 

#!/bin/sh

 

file_count=`find ./ -type f -cmin +1 | wc -l`

if [ $file_count -gt 0 ]

then

         echo "YES"

else

         echo "NO"

fi



* 추가연습 과제 : 2.3 숫자야구 게임을 1회까지 확장시키기 (종료조건 : 3 OUT이 되면 종료)

끝.

 
스터디에서 공부한 순서는 정리한 순서의 거꾸로라는게 함정.. ^^
앞으로 4/5주차까지는 위의 2번처럼 순수 스크립트 문법만을 가지고 스크립트 짜는 연습을 하는데 초점을 두려고 합니다.
스크립트를 작성하는데 어느정도 익숙해지고 나면 그 이후에 주로 사용되는 리눅스 명령어들을 이용한 다양한 활용법들에 대해 
학습할 예정입니다.

그럼 이번주에도 간단한 예제를 같이 작성하는 걸로 진행을 하겠습니다. 
음.. 아무래도 제가 게임 개발자라... 예제가 게임쪽으로 밖에 생각이 안나네요.. ㅋㅋ
그래도.. 게임 예제를 해보는게 초반에 흥미 유발이 더 될 수 있고, 이런게 순수하게 스크립트 문법만 연습하기도 좋죠!

이번주 예제 : 오크와의 전투
조건 : 플레이어는 1/2 중 임의의 숫자를 전투가 끝날 때까지 계속 입력 (1:공격/2:방어)
1:공격 - 오크에게 5 ~ 10의 피해를 입힌다.
2:방어 - 다음 오크의 공격 데미지를 받지 않는다.
오크는 플레이어가 한번 입력한 이후에 한번씩 공격을 해서 플레이어에게 1 ~ 10의 피해를 입힌다.
오크와 플레이어의 체력은 100이다.

추가 과제 
  - 3:특수스킬을 추가한다 (효과 : 추가로 공격을 한번 더한다, 단 게임 중 한번만 사용 가능)
예시 :

GAME START!

[ Player HP : 100 / Orc : 100 ]
Select (1-3) : 
1
Player Attack! 
Orc damaged  -5
Orc Attack! 
Player damaged -10
[ Player HP : 90 / Orc : 95 ]
Select (1-3) : 
2
Player Defence!
Orc Attack!
Player damaged -0
[ Player HP : 90 / Orc : 95 ]
Select (1-3) : 
3
Player Attack!
Orc damaged -7
Player Attack!
Orc damaget -10
Orc Attack!
Player damaged -8
[ Player HP : 82 / Orc : 78 ]
...
...
...
[ Player HP : 10 / Orc : 0 ]
<< Player Win >>



감사합니다.
728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,