쉘 스크립트 이용해서 간단한 게임을 만들어 봤다.

이해 쉽게 주석 달아 놨음

 

자세한건 : https://github.com/realsung/Shell_Game

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
hhs#!/bin/bash
 
function main_print(){ # 메인 옵션들 출력
    echo "◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎"
    echo "=                                                 ="
    echo -"\033[1;31m=                  1. 겜 시작                     ="
    echo -"\033[1;33m\033[0m""=                                                 ="
    echo -"\033[1;31m=                  2. 도움말                      ="
    echo -"\033[1;33m\033[0m""=                                                 ="
    echo -"\033[1;31m=                  3. 종료                        ="
    echo -"\033[1;33m\033[0m""=                                                 ="
    echo -"\033[1;36m=  About : https://github.com/realsung/Shell_Game ="
    echo -"\033[1;33m\033[0m""=                                                 ="
    echo -"◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎"
}
 
function menu(){ # 게임 메뉴들
    echo "[0] 뒤로가기"
    echo "[1] 숫자 맞추기 게임"
    echo "[?] 업데이트 예정..."
}
 
function game1(){ # 1. 숫자 맞추기 게임
    echo "숫자 맞추기 게임"
    echo "1 ~ 100 사이의 숫자를 입력 해주세요"
    rand=$(( ( $RANDOM % 100 ) + 1 )) # 랜덤 함수 사용해서 100까지 숫자중 랜덤 숫자 하나 지정
    for((i=0; i<=7; i++)); # 8번 반복
    do
        echo -"\033[1;32m" # [*] Input 초록색 지정 
        printf "[*] Input : "
        read game1_input # 입력
        echo -"\033[1;33m\033[0m" #나머지는 일반 색
        if [ ${rand} -eq ${game1_input} ]; then # 랜덤 값과 내가 입력한 값이 같으면 
            echo "You got it!!" # 잘했음
            break ;
        else
            if [ ${rand} -gt ${game1_input} ]; then # 내가 입력한 값이 랜덤 값보다 작으면
                echo "더 높은 수를 입력하세요"
            elif [ ${rand} -lt ${game1_input} ]; then # 내가 입력한 값이 랜덤 값보다 크면
                echo "더 낮은 수를 입력하세요"
            fi
        fi
    done
    sleep 2s
    echo ""
}
 
function helpme(){ # 도움말
    echo "[*] 게임 시작을 눌렀을 때 "
    sleep 1s
    echo "1. 숫자 맞추기 게임"
    sleep 1s
    echo "랜덤으로 숫자가 나옵니다."
    sleep 1s
    echo "당신은 8번의 기회가 있습니다"
    sleep 1s
    echo "1~100까지의 숫자 중에 하나를 맞추면 되는 게임입니다."
    sleep 3s
    echo ""
}
 
function end(){ # 종료
    echo "정말 종료할거야? ㅠ "
    sleep 0.5s
    echo "1. 종료"
    sleep 0.5s
    echo "2. 아니야"
    echo -"\033[1;31m" # [*] Input 빨강색 지정 
    printf "[*] Input : "
    read exit 
    echo -"\033[1;33m\033[0m" #나머지는 일반 색
    if [ ${exit} -eq 1 ]; then # 1 누르면 종료
        echo "Bye Bye ~"
        exit 0
    elif [ ${exit} -eq 2 ]; then #2 누르면 뒤로가기
        continue ;
    else
        echo "입력 값이 잘못됨"
    fi
    echo ""
}
 
while :
do
    main_print # 1,2,3 옵션 있는 거 출력
    echo -"\033[1;32m" # [*] Input 초록색 지정 
    printf "[*] Input : "
    read input # 입력
    echo -"\033[1;33m\033[0m" #나머지는 일반 색
    if [ ${input} -eq 1 ]; then #1번 눌렀을 때 game1 함수 실행
        menu # 메뉴함수 호출
        echo -"\033[1;32m" # [*] Input 초롤색 지정 
        printf "[*] Input : "
        read memu_num # 입력
        echo -"\033[1;33m\033[0m" #나머지는 일반 색
        if [ ${memu_num} -eq 0 ]; then # 메뉴 번호 = 0 뒤로가기
            echo ""
            continue ;
        elif [ ${memu_num} -eq 1 ]; then # 메뉴번호 = 1 숫자맞추기 게임
            game1
        else 
            echo "입력 값이 잘못됨"
            echo ""
        fi
    elif [ ${input} -eq 2 ]; then #2번 눌렀을 때 도움말들 
        helpme # 도움말 함수 호출
    elif [ ${input} -eq 3 ]; then #3번 눌렀을 때 종료 옵션
        end # 종료 함수 호출
    else
        echo "1,2,3중에 하나만 고르세요"
    fi
done
 

 

'ShellScript' 카테고리의 다른 글

Shell Script 정리  (0) 2018.12.02

Shell Script

#!/bin/sh
#!/bin/bash
#!/bin/zsh

#으로 시작하면 주석인데 # 바로 뒤에 ! 가 오면 스크립트를 실행할 쉘을 지정하는 선언문이다.

주석

# example it's comment!

맨 앞글자에 # 을 붙여주면 된다.

출력

#!/bin/bash
echo "My name is Sung"
printf "Hello World!"

echo

문장을 출력해주는데 python의 print()처럼 자동 줄바꿈이 된다. 변수 출력시에는 앞에 $ 을 붙여준다.

printf

C언어와 매우 유사하다. 줄 바꿈이 안 된다.

변수

#!/bin/bash
var1="Apple"
var2="Strawberry"

fuction f(){
local var3="it's Local variable"
echo $var3
}
echo $var1 $var2
printf "local variable : "
f

변수를 사용하려면 앞 뒤 공백 없이 = 를 입력하면 대입연산자가 된다.

그리고 그냥 선언한 변수는 전역 변수가 된다. 함수 안에서 지역변수를 사용하려면 변수 이름 앞에 local을 붙여주면 된다.

함수

#!/bin/bash
function test1(){
   echo "It's test1"
}
test2(){
echo "It's test2"
}
test1
test2

함수를 선언할 때 function을 붙여도 되고 안붙여도 상관 없다.

단, 함수 명을 쓰면 함수가 호출이 되는데 호출 코드가 함수 코드보다 반드시 에 있어야 된다. 함수 코드 보다 앞에서 호출 시 오류가 발생한다.

배열

#!/bin/bash
arr=('a' 'b' 'c' 'd')

arr[4]='test'
echo ${arr[4]}

arr[5]='input'
echo ${arr[5]}

echo ${arr[@]}

unset arr
echo ${arr[@]}

배열 사용시에는 괄호를 사용해야한다.

기존 배열에 값을 추가할 수 있고 바꿀 수도 있다.

특정 배열의 함수를 보고싶으면 arr[@] 또는 arr[*]을 사용한다. unset을 이용하면 배열을 지울 수 있다.

참고로 1차원 배열밖에 사용하지 못 한다.

조건문

#!/bin/bash
var1=10
var2=11
if [ ${var1} -eq ${var2} ]; then
echo "var1 Equal var2"
elif [ ${var1} -ne ${var2} ]; then
echo "var1 Not Equal var2"
fi

if문의 기본 형태는 아래와 같다.

값 조건식 값을 넣을 때 띄어쓰기가 안 들어가면 스크립트 에러가 난다.

if

[ 값 조건식 값 ]; then

~~~

fi

조건식설명
-z문자열의 길이가 0이면 참
-n문자열의 길이가 0이 아니면 참
-eq값이 같으면 참
-ne값이 다르면 참
-gt값1 > 값2
-ge값1 >= 값2
-lt값1 < 값2
-le값1 <= 값2
-a&& , And연산과 동일
-o|| , xor 연산과 동일

선택문

#!/bin/bash
echo "Enter a Num between 1 to 5"
read num
case $num in
1) echo "You pick Number 1" ;;
2) echo "You pick Number 2" ;;
3) echo "You pick Number 3" ;;
4) echo "You pick Number 4" ;;
5) echo "You pick Number 5" ;;
*) echo "Invalid Number" ;;
esac

문장 끝은 ;; 으로 끝내준다. 그리고 case에 없는 값은 *) 을 사용해서 예외 할 수 있다.

반복문

반복문을 빠져 나갈 때 braek 를 사용하고 반복문이나 조건문을 건너 뛸 때는 `continue를 사용한다.

#!/bin/bash
for i in {1..5..2}
do
echo ${i}
done

count=5

for((i=1; i<=count; i++)); do
printf ${i}" "
done

echo ""

i=0
while [ $i -le 5 ]
do
   echo $i
    i=$(($i+1))
done

for문은 아래와 같은 형식으로 이루어져 있다.

for [변수] in [반복 조건]
do
  [실행문]
done

while문은 아래와 같은 형식으로 이루어져있다.

while [ 값1 조건식 값2 ]
do
  [실행문]
  [실행문]
done

변수 타입

#!/bin/bash
declare -r str_var="Hello"
declare -i num_var=9999
declare -a arr_var=(1 4 'NOP' 10)
declare -x exp_var="export"

func(){
echo "fuction..."
}

declare -f func

echo ${str_var} ${num_var} ${arr_var[*]} ${exp_var}

변수는 타입을 구분하지 않고 기본적으로 문자열이다. 단 문맥에 따라 연산 처리를 한다.

그래서 변수 타입을 지정하기 위해서 declare , typeset 타입 지정 명령을 지원한다. 옵션은 같다.

-r은 읽기전용 -i는 정수 -a는 배열 -x는 환경 변수 -f는현재 스크립트의 함수 출력을 해준다.

예약 변수

문자설명
HOME사용자의 홈 디렉토리
PATH실행 파일을 찾을 경로
LANG프로그램 사용시 기본 지원되는 언어
PWD사용자의 현재 작업중인 디렉토리
FUNCNAME현재 함수 이름
SECONDS스크립트가 실행된 초 단위 시간
SHLVL쉘 레벨(중첩된 깊이를 나타냄)
SHELL로그인해서 사용하는 쉘
PPID부모 프로세스의 PID
BASHBASH 실행 파일 경로
BASH_ENV스크립트 실행시 BASH 시작 파일을 읽을 위치 변수
BASH_VERSION설치된 BASH 버전
BASH_VERSINFOBASH_VERSINFO[0]~BASH_VERSINFO[5]배열로 상세정보 제공
MAIL메일 보관 경로
MAILCHECK메일 확인 시간
OSTYPE운영체제 종류
TERM로긴 터미널 타입
HOSTNAME호스트 이름
HOSTTYPE시스템 하드웨어 종류
MACHTYPE머신 종류(HOSTTYPE과 같은 정보지만 조금더 상세하게 표시됨)
LOGNAME로그인 이름
UID사용자 UID
EUIDsu 명령에서 사용하는 사용자의 유효 아이디 값(UIDEUID 값은 다를 수 있음)
USER사용자의 이름
USERNAME사용자 이름
GROUPS사용자 그룹(/etc/passwd 값을 출력)
HISTFILEhistory 파일 경로
HISTFILESIZEhistory 파일 크기
HISTSIZEhistory 저장되는 개수
HISTCONTROL중복되는 명령에 대한 기록 유무
DISPLAYX 디스플레이 이름
IFS입력 필드 구분자(기본값: - 빈칸)
VISUALVISUAL 편집기 이름
EDITOR기본 편집기 이름
COLUMNS현재 터미널이나 윈도우 터미널의 컬럼 수
LINES터미널의 라인 수
LS_COLORSls 명령의 색상 관련 옵션
PS1기본 프롬프트 변수(기본값: bash\$)
PS2보조 프롬프트 변수(기본값: >), 명령을 ""를 사용하여 명령 행을 연장시 사용됨
PS3쉘 스크립트에서 select 사용시 프롬프트 변수(기본값: #?)
PS4쉘 스크립트 디버깅 모드의 프롬프트 변수(기본값: +)
TMOUT0이면 제한이 없으며 time시간 지정시 지정한 시간 이후 로그아웃

위치 매개 변수

문자설명
$0실행된 스크립트 이름
$1$1 $2 $3...${10}인자 순서대로 번호가 부여된다. 10번째부터는 "{}"감싸줘야 함
$*전체 인자 값
$@전체 인자 값($* 동일하지만 쌍따옴표로 변수를 감싸면 다른 결과 나옴)
$#매개 변수의 총 개수

특수 매개 변수

문자설명
$$현재 스크립트의 PID
$?최근에 실행된 명령어, 함수, 스크립트 자식의 종료 상태
$!최근에 실행한 백그라운드(비동기) 명령의 PID
$-현재 옵션 플래그
$_지난 명령의 마지막 인자로 설정된 특수 변수

매개 변수 확장

문자설명
${변수}$변수와 동일하지만 {} 사용해야만 동작하는 것들이 있음
${변수:위치}위치 다음부터 문자열 추출
${변수:위치:길이}위치 다음부터 지정한 길이 만큼의 문자열 추출
${변수:-단어}변수 미선언 혹은 NULL일때 기본값 지정, 위치 매개 변수는 사용 불가
${변수-단어}변수 미선언시만 기본값 지정, 위치 매개 변수는 사용 불가
${변수:=단어}변수 미선언 혹은 NULL일때 기본값 지정, 위치 매개 변수 사용 가능
${변수=단어}변수 미선언시만 기본값 지정, 위치 매개 변수 사용 가능
${변수:?단어}변수 미선언 혹은 NULL일때 단어 출력 후 스크립트 종료
${변수?단어}변수 미선언시만 단어 출력 후 스크립트 종료
${변수:+단어}변수 선언시만 단어 사용
${변수+단어}변수 선언 혹은 NULL일때 단어 사용
${#변수}문자열 길이
${변수#단어}변수의 앞부분부터 짧게 일치한 단어 삭제
${변수##단어}변수의 앞부분부터 길게 일치한 단어 삭제
${변수%단어}변수의 뒷부분부터 짧게 일치한 단어 삭제
${변수%%단어}변수의 뒷부분부터 길게 일치한 단어 삭제
${변수/찾는단어/변경단어}처음 일치한 단어를 변경
${변수//찾는단어/변경단어}일치하는 모든 단어를 변경
${변수/#찾는단어/변경단어}앞부분이 일치하면 변경
${변수/%찾는단어/변경단어}뒷부분이 일치하면 변경
${!단어*}, ${!단어@}선언된 변수중에서 단어가 포함된 변수 명 추출(

비트 연산자

문자설명
<<비트 왼쪽 쉬프트(쉬프트 한 번당 2를 곱하는 것과 동일함)
<<=left-shift-equal
>>비트 오른쪽 쉬프트(쉬프트 한 번당 2로 나눔)
>>=right-shift-equal(<<=와 반대)
&비트 and
&=비트 and-equal
|비트 OR
|=비트 OR-equa
~비트 negate
!비트 NOT
^비트 XOR
^=비트 XOR-equal

기타 연산자

문자설명
,콤마 연산자(comma operator), 2개 이상의 산술 연산을 묶어줌

정수 비교

문자설명
-eq같음
-ne같지 않음
>, -gt더 큼(> 이중 소괄호에서 사용 가능)
>=, -ge더크거나 같음(>= 이중 소괄호에서 사용 가능)
<, -lt더 작음(< 이중 소괄호에서 사용 가능)
<=, -le더 작거나 같음(<= 이중 소괄호에서 사용 가능)

문자열 비교

문자설명
=, ==같음
!=같지 않음
<ASCII 알파벳 순서에 더 작음
>ASCII 알파벳 순서에서 더 큼
-z문자열이 NULL, 길이가 0인 경우
-n문자열이 NULL이 아님
${변수}문자열이 NULL이 아님

'ShellScript' 카테고리의 다른 글

Shell Script Game v1.0  (0) 2018.12.02

+ Recent posts