Day61

2021. 1. 8. 10:21교육과정/KOSMO

키워드 : 파이써닉 코딩 ( unpacking, enumerate, zip ) / comprehension (파이썬 새 문법) / 함수의 인자 / CMD에서 탐캣 실행하기 / 리눅스 쉘 프로그래밍

 

****

 

 

0. 파이썬 복습

   ※ 파이썬의 제어문

 조건문  if
 반복분  for / while
 반복문 제어  break / continue

 

 

1. 파이써닉 코딩 - unpacking

   : 각 요소를 분해하여 추출

 

(1) 문자열 unpacking

msg = '행복해'            # 문자열
c1, c2, c3 = msg

print(c1, c2, c3)

# 실행결과
'''
행 복 해
'''

 

※ 각 요소의 갯수와 변수의 갯수는 일치해야 한다. (아닐 경우 에러 발생)

# 에러 발생

msg = '행복해'  
c1, c2 = msg
print(c1, c2)

msg = '행복해'  
c1, c2, c3, c4 = msg
print(c1, c2, c3, c4)

 

(2) 리스트 unpacking (언패킹)

li = ['a','b','c']       # 리스트
c1, c2, c3 = li
print(c1, c2, c3)

# 실행결과
'''
a b c
'''

※ * 의 다양한 활용법  (각 명칭의 정확한 용어를 모르겠음. 임의로 붙인 명칭임)

    ① 최외각 데이터 구조 제거 치트키

        : * 을 사용하여 리스트, 튜플, Set 을 임시적으로 제거할 수 있다. 

double = [ [1,5],[10,4],[4,7] ]

print(double)
print(*double)

# 실행결과
'''
[[1, 5], [10, 4], [4, 7]]
[1, 5] [10, 4] [4, 7]
'''
bb = {1, 2, 3, 4}
print(*bb)

# 실행결과
'''
1 2 3 4
'''

     - 데이터 구조 제거 후 변수에 저장할 수는 없으나 zip( ) 함수 등에 사용할 수 있다. 

l = list(zip(*double))
print(l)
print(*l)

# 실행결과
'''
[(1, 10, 4), (5, 4, 7)]
(1, 10, 4) (5, 4, 7)
'''

 

    ② 언패킹 치트키 ( 요소 모으기 )

        : 언패킹시 변수의 갯수와 요소의 갯수가 다를 경우 에러가 발생하나, 

          * 사용시 가변인자 모으기(positional argument list)와 같은 역할을 한다. 

*a, b, c = [1, 2, 3, 4, 5, 6, 7, 8]
print(a)
print(b)
print(c)

# 실행결과
'''
[1, 2, 3, 4, 5, 6]
7
8
'''

 

 

 

(3) 튜플 unpacking

tpl = ('ㄱ','ㄴ','ㄷ')    # 튜플
c1, c2, c3 = tpl
print(c1, c2, c3)

# 실행결과
'''
ㄱ ㄴ ㄷ
'''

 

(4) 딕셔너리 unpacking

    ※ key값만 출력된다. 

di = {'k': 5, 'j': 6, 'l':7 }    # 딕셔너리
c1, c2, c3 = di
print(c1, c2, c3)

# 실행결과
'''
k j l
'''

 

    ※ value값만 출력하기

di = {'k': 5, 'j': 6, 'l':7 }    # 딕셔너리
c1, c2, c3 = di.values()
print(c1, c2, c3)

# 실행결과
'''
5 6 7
'''

 

    ※ key와 value 출력하기 ( 튜플 형태로 )

di = {'k': 5, 'j': 6, 'l':7 }    # 딕셔너리
c1, c2, c3 = di.items()
print(c1, c2, c3)

# 실행결과
'''
('k', 5) ('j', 6) ('l', 7)
'''

 

    ※ key와 value 출력하기 ( json 형태로 )

        → 딕셔너리는 반복문을 이용하여 key와 value를 출력할 수 있다. 

di = {'k': 5, 'j': 6, 'l':7 }

for (key, value) in di.items():
    print(key, ":", value)

# 실행결과
'''
k : 5
j : 6
l : 7
'''

 

    ※ 리스트에서 튜플끼리의 합 구하기

alist = [ (1,2), (3,4), (5,6) ]

for a, b in alist:
    print('first+second={}'.format(a+b))
    
# 실행결과
'''
first+second=3
first+second=7
first+second=11
'''

    → 리스트(집합류)에서 추출한 요소가 (a, b) 형식의 튜플일 경우, 

        튜플을 다시 a, b로 분해하여 각 변수에 지정한다. 

 


2. 파이써닉 코딩 - enumerate( ) 

   : 리스트의 각 요소에 인덱스를 붙여 튜플 형태로 출력할 수 있도록 만든다.

 

user_list = ['개발자', '코더', '전문가', '분석가']

print(enumerate(user_list))
for value in user_list:
    print(value)
    
# 실행결과
'''
<enumerate object at 0x0000025C0E141318> ..... 객체라서 값이 바로 출력되지 않음
개발자
코더
전문가
분석가
'''

for value in enumerate(user_list):
    print(value)

# 실행결과
'''
(0, '개발자')
(1, '코더')
(2, '전문가')
(3, '분석가')
'''

 

※ enumerate( ) 함수에 unpacking을 사용하여 인덱스를 손쉽게 출력할 수 있다. 

user_list = ['개발자', '코더', '전문가', '분석가']
for idx, value in enumerate(user_list):
    print(idx, value)
    
# 실행결과    
'''
0 개발자
1 코더
2 전문가
3 분석가
'''

 


3. 파이써닉 코딩 - zip( ) ★

 

※ zip( ) 함수를 사용하여 리스트의 값들을 묶을 수 있다. 

days = ['월', '화', '수']
doit = ['잠자기', '밥먹기', '공부하기']

print(zip(days, doit))
print(type(zip(days,doit)))
print(list(zip(days, doit)))
print(dict(zip(days, doit)))

# 실행결과
'''
<zip object at 0x000001ADCAA857C8> ..... 객체라서 값이 바로 출력되지 않음
<class 'zip'>
[('월', '잠자기'), ('화', '밥먹기'), ('수', '공부하기')]
{'월': '잠자기', '화': '밥먹기', '수': '공부하기'}
'''

 

※ zip( ) 함수를 사용하여 반복문에서 출력할 수 있다. 

for (a,b) in zip(days, doit):
    print('{}요일에는 {}를 합니다.'.format(a,b))

# 실행결과
'''
월요일에는 잠자기를 합니다.
화요일에는 밥먹기를 합니다.
수요일에는 공부하기를 합니다.
'''

 


3. 컴프리핸션 (comprehension) - 리스트 컴프리핸션

 

    @ 컴프리핸션 (comprehension)
    ` 하나 이상의 이터레이터로부터 파이썬 자료구조를 만드는 컴팩트한 방법
    ` 비교적 간단한 구문으로 반복문과 조건 테스트를 결합

    * 리스트 컨프리핸션
        [ 표현식 for 항목 in 순회가능객체 ]
        [ 표현식 for 항목 in 순회가능객체 if 조건 ]

    * 딕셔러리 컨프리핸션
        { 키_표현식: 값_표현식 for 표현식 in 순회가능객체 }

    * 셋 컨프리핸션
        { 표현식 for 표현식 in 순회가능객체 }

    * 튜플은 컴프리핸션이 없다.

 

(1) append( ) 함수를 사용하여 리스트에 값 지정하기 - 컴프리핸션X

alist = []
alist.append(1)
alist.append(2)
alist.append(3)
alist.append(4)
alist.append(5)
alist.append(6)
print(alist)

# 실행결과
'''
[1, 2, 3, 4, 5, 6]
'''

 

(2) 반복문을 사용하여 리스트에 값 지정하기 - 컴프리핸션X

alist = []
for n in range(1,7):
    alist.append(n)
print('2', alist)

# 실행결과
'''
[1, 2, 3, 4, 5, 6]
'''

 

(3) comprehension을 사용하여 리스트에 값 지정하기 - 컴프리핸션X

alist = list(range(1,7))
print('3', alist)

# 실행결과
'''
[1, 2, 3, 4, 5, 6]
'''

 

(4) 리스트 컴프리핸션

    * 리스트 컨프리핸션
        [ 표현식 for 항목 in 순회가능객체 ]
        [ 표현식 for 항목 in 순회가능객체 if 조건 ]

 

※ 리스트 컴프리핸션을 사용하여 리스트에 값을 지정하기

# 반복문에서 1~7까지 순서대로 돌면서 각 값을 list n에 담는다.
blist = [n for n in range(1,7)]
print(blist)

# 실행결과
'''
[1, 2, 3, 4, 5, 6]
'''

 

※ 연산이 추가된 리스트 컴프리핸션을 사용하여 리스트에 값을 지정하기

# 반복문에서 추출한 값에 연산을 추가하고 list에 담는다.
blist = [n+10 for n in range(1,7)]
print(blist)

# 실행결과
'''
[11, 12, 13, 14, 15, 16]
'''

 

※ 제어문이 추가된 리스트 컴프리핸션을 사용하여 리스트에 값을 지정하기

# 반복문에서 추출한 값이 홀수일 경우 list에 담는다.
blist = [n for n in range(1,7) if n%2 == 1]
print(blist)

# 실행결과
'''
[1, 3, 5]
'''

 

※ 연습 - 컴프리핸션을 사용하여 튜플구조의 리스트 만들기

# 반복문1에서 1~4까지 돌면서 r값이 지정되고, 반복문2에서 1~3가지 돌면서 c값이 지정되어
# 튜플 형태(r,c)로 리스트 clist에 담는다.
clist = [(r,c) for r in range(1,4) for c in range(1,3)]
print(clist)

# 실행결과
'''
[(1, 1), (1, 2), (2, 1), (2, 2), (3, 1), (3, 2)]
'''

※ 연습 - 컴프리핸션 없이 튜플구조의 리스트 만들기

# 컴프리핸션 없이 튜플구조의 리스트 생성
dlist = []
for r in range(1,4):
    for c in range(1,3):
        dlist.append((r,c))
print(dlist)

# 실행결과
'''
[(1, 1), (1, 2), (2, 1), (2, 2), (3, 1), (3, 2)]
'''

 


4. 컴프리핸션 (comprehension) - 셋 컴프리핸션

    * 셋 컨프리핸션
        { 표현식 for 표현식 in 순회가능객체 }

 

※ 셋 컴프리핸션을 사용하여 셋 구조 만들기

aset = {a for a in range(1,7)}
print(aset)

# 실행결과
'''
{1, 2, 3, 4, 5, 6}
'''

 

※ 셋 컴프리핸션을 사용하여 리스트의 값을 셋에 담기

datas = [1,2,3,2,1,4,5]
aset = {a for a in datas}
print(aset)

# 실행결과
'''
{1, 2, 3, 4, 5}
'''

 

※ (참고) 셋 컴프리핸션 비교

datas = [1,1,1,2,2,3,3,4]
bSet = {n for n in datas}
cSet = set(datas)
print(bSet)
print(cSet)

# 실행결과
'''
{1, 2, 3, 4}
{1, 2, 3, 4}
'''

 


5. 컴프리핸션 (comprehension) - 딕셔너리 컴프리핸션

    * 딕셔러리 컨프리핸션
        { 키_표현식: 값_표현식 for 표현식 in 순회가능객체 }

 

※ " 표현식 : 표현식 " 을 사용하여 딕셔너리 구조를 만들 수 있다. 

datas = (2,3,4)
adic = { n: n**2 for n in datas }
print(adic)

# 실행결과
'''
{2: 4, 3: 9, 4: 16}
'''

※ 딕셔너리 구조는 set과 마찬가지로 중복을 허용하지 않는다. 

datas = (2,3,2)
adic = { n: n**2 for n in datas }
print(adic)

# 실행결과
'''
{2: 4, 3: 9}
'''

 

(+) 파이써닉 코드 참고

# word에서 한 글자씩 추출하여 letter라는 변수에 지정하고,
# 각 글자 : word에 있는 글자의 갯수
# 로 딕셔너리 구조를 만든다.

word = 'LOVE LOL'
wcnt = { letter: word.count(letter) for letter in word }
print(wcnt)

# 실행결과
'''
{'L': 3, 'O': 2, 'V': 1, 'E': 1, ' ': 1}
'''
for문을 돌며 wcnt 딕셔너리의 첫 요소로 L : 3 을 만들고 다음으로 O : 2를 만든다.
그런데 뒤에 L과 O가 또 나올 때는 뒤에서 L : 3 을 만들어서 다시 추가한다. 

6. 제너레이터 컴프리핸션 ------ 안 중요함!!!!!! 

 

# ( ) 를 사용하면 튜플이라 생각하지만 튜플은 컨프리핸션이 없다.
# 제너레이터는 한 번만 실행한다.
# 즉석에서 그 값을 생성하고 한 번에 값을 하나씩만 처리하고 저장하지 않는다.

 

datas = [1,2,3,4,5,6,7]

result2 = ( n for n in datas )

print(result2)
print(type(result2))
print(list(result2))

# 실행결과
'''
<generator object <genexpr> at 0x0000019B77741BC8>
<class 'generator'>
[1, 2, 3, 4, 5, 6, 7]
'''

 

datas = [1,2,3,4,5,6,7]

result1 = { n for n in datas }
print(result1)
print(type(result1))

# 실행결과
'''
{1, 2, 3, 4, 5, 6, 7}
<class 'set'>
'''

 


7. 함수 - 인자와 리턴값

 

    [ 함수 ]

     반복적인 구문을 만들어 함수로 선언하여 간단하게 호출만 하고자 한다

     def 함수명(매개변수):
        수행할 문장들

 

(1) 인자도 리턴값도 없는 함수

 

※ 함수를 호출하기

def func():
    print('함수안에서 실행')

func()

# 실행결과
'''
함수안에서 실행
'''

 

※ 함수의 결과를 출력하기

    : 리턴값이 없어서 None 이라고 출력된다. 

def func():
    print('함수안에서 실행')

print(func())

# 실행결과
'''
함수안에서 실행
None
'''

 

※ 함수에 리턴값 지정하고 출력하기

def func():
    print('함수안에서 실행')
    return '결과값'

print(func())

# 실행하기
'''
함수안에서 실행
결과값
'''

 

(2) 리턴값이 여러 개인 함수 가능

    → 리턴값은 튜플 구조로 출력된다. 

def func(arg1, arg2):
    return arg1+arg2, arg1*arg2

result = func(2,3)
print(result)  
print(type(result))

# 실행결과
'''
(5, 6)
<class 'tuple'>
'''

 

※ 리턴값을 각각 따로 출력할 수도 있다. 

def func(arg1, arg2):
    return arg1+arg2, arg1*arg2

hap, gob = func(2,3)
print('합', hap)
print('곱', gob) 

# 실행결과
'''
합 5
곱 6
'''

 

(3) 위치인자 (positional argument)

    : 인자가 순서대로 들어간다.

def func(greeting, name):
    print( greeting, '!!!!', name, '님')

func('안녕', '박길동')           
func('홍길동', 'Hi')             
print(type(func('안녕', '김길동')))   

# 실행결과
'''
홍길동 !!!! Hi 님
안녕 !!!! 박길동 님
안녕 !!!! 김길동 님
<class 'NoneType'>
'''

 

(4) 키워드 인자 (keyword argument)

   : 키워드에 알맞은 위치에 값이 대입된다. 

def func(greeting, name):
    print( greeting, '!!!!', name, '님')

func(name='올라프', greeting='올라')  

# 실행결과
'''
올라 !!!! 올라프 님
'''

 

(5) 인자의 갯수가 일치하지 않을 경우

    : 자바스크립트에서는 인자 갯수가 일치하지 않을 경우 맞는 갯수까지만 대입하고

      나머지는 무시하여 에러가 없었지만 파이썬에서는 에러가 발생한다.

def func(greeting, name):
    print( greeting, '!!!!', name, '님')

func('안녕', '박길동', '즐~~')        
func('안녕')    

# 실행결과
'''
모두 에러 발생한다.
'''

 

(6) 매개변수(인자)의 기본값 지정하기

    : 인자의 기본값을 지정함으로써 인자가 들어오지 않을 경우에 대한 에러를 방지할 수 있다. 

def func(greeting, name='아무개'):
    print( greeting, '!!!!', name, '님')

func('안녕')

# 실행결과
'''
안녕 !!!! 아무개 님
'''

 

(7) 인자가 여러 개이고 빈 리스트가 인자로 포함되는 경우

    : 함수가 선언될 때 빈 리스트가 만들어지고 함수가 호출될 때 값이 대입된다. 

def buggy(arg, result=[]):
    result.append(arg)
    print(result)

buggy('가')
buggy('나')
buggy('다')
buggy('라', [1,2])
buggy('마')

# 실행결과
'''
['가']
['가', '나']
['가', '나', '다']
[1, 2, '라'] 
['가', '나', '다', '마']
'''

... # 인자로 먼저 [1,2]가 들어가고 이후에 append() 함수를 통해 리스트에 arg가 추가되므로 [1,2,'라'] 라고 출력된다. 

 


8. 함수 - 인자 모으기 (Arbitrary Argument Lists, 가변 인수 모음)

 

※ 인자의 갯수가 지정되지 않았을 경우에 사용할 수 있다. 

 

(1) 위치 인자 모으기 (a list as positional argument) --- * args

  첫번째와 두번째는 인자가 반드시 들어가고 세번째는 인자가 들어갈 수도 있고 없으면 0으로 초기화한다.
  그러나 네번째 인자부터는 정확히 모른다면 위치 가변인자를 사용하여 값을 받고 튜플에 지정할 수 있다. 
def func(a,b, c=0, *args):  # #args : 엄청 중요
    sum = a + b + c
    print(args)
    for i in args:
        sum += i
    return sum

print(func(4, 5))
print(func(4, 5, 6))
print(func(4, 5, 6, 7))
print(func(4, 5, 6, 7, 8, 9))       # args에 7,8,9가 튜플로 들어간다

# 실행결과
'''
()
9
()
15
(7,)
22
(7, 8, 9)
39
'''

 

(2) 키워드 인자 모으기 (a list as keyword argument) --- ** kwargs

  key=value로 구성된 인자가 여러 개 들어오고, 얼만큼 들어올지 모르는 경우에
  키워드 가변인자로 값을 받고 딕셔너리에 지정할 수 있다. 
def func(a,b, c=0, **kwargs):  # **kwargs : 엄청 중요
    sum = a + b + c
    print(kwargs)
    for k in kwargs:
        sum += kwargs[k]
    return sum

print(func(4, 5))
print(func(4, 5, 6))
print(func(4, 5, 6, math=7))
print(func(4, 5, 6, math=7,eng=8, his=9))
print(func(math=8))

# 실행결과
'''
{}
9
{}
15
{'math': 7}
22
{'math': 7, 'eng': 8, 'his': 9}
39
'''

   → kor=7도 한 덩어리 , math=7,eng=8, his=9도 한 덩어리로 취급하여 kwargs에 지정된다.

 


9. 연습문제

 

(1) BMI(Body Mass Index)는 체중(kg)을 신장(m)의 제곱(**2)으로 나눈 값으로 체지방 축적을 잘 반영하기 때문에 비만도 판정에 많이 사용한다. 사용자로부터 신장과 체중을 입력 받아서 BMI 값에 따라서 다음과 같은 메시지를 출력하는 프로그램을 작성하여 보자. 

  BMI   메시지
  20 ~ 24.9   정상입니다.
  25~29.9   과체중입니다.
  30 이상   비만입니다. 
w = float(input('무게(킬로그램) :'))
h = float(input('키(미터) :'))
bmi = w / (h**2)
print('당신의 BMI : {:.1f}'.format(bmi))

if bmi >= 20 and bmi < 25:
    print('정상입니다.')
elif bmi >=25 and bmi < 30:
    print('과체중입니다.')
elif bmi >= 30:
    print('비만입니다.')
else:
    print('저체중입니다.')
    
# 실행결과
'''
무게(킬로그램) :86
키(미터) :1.83
당신의 BMI : 25.68
과체중입니다.
'''

 

(2) 1부터 99까지 2자리의 정수로 이루어진 복권이 있다고 하자. 2자리가 전부 일치하면 1등상 100만원을 받는다. 2자리 중에서 하나만 일치하면 50만원을 받고 하나도 일치하지 않으면 상금은 없다. 

import random
number = str(random.randint(1, 20))
print(number)
lotto = (input('복권 번호(1-99사이)를 입력하시오: '))

if len(lotto) == len(number) and lotto == number:
    print('상금 100만원')
elif len(lotto) == len(number) and lotto[0] in number and lotto[1] in number:
    print('상금 100만원')
elif len(lotto) == 1:
    print('상금 50만원' if lotto[0] in number else '상금은 없습니다.')    
elif len(lotto) == 2 and lotto[0] in number or lotto[1] in number:
    print('상금 50만원')      
else:
    print('상금은 없습니다.')



# 실행결과
'''
13
복권 번호(1-99사이)를 입력하시오: 31
상금 100만원

3
복권 번호(1-99사이)를 입력하시오: 31
상금 50만원
'''

 

(3) 리스트를 인자로 받아 짝수만 갖는 리스트 반환하는 함수를 만들어서 호출하여 그 결과를 출력하시오.

def even_filter(list=[]):
    return [i for i in list if i % 2 == 0]


print(even_filter([1,2,4,5,8,9,10]))

# 실행결과
'''
2 4 8 10
'''

 

(4) 주어진 수가 소수인지 아닌지 판단하는 함수를 만들어서 호출하여 그 결과를 출력하시오.

def is_prime_number(num):
    for i in range(2,num):
        if num % i == 0:
            return '소수가 아닙니다.'
            break
    return '소수입니다.'

    
print(is_prime_number(60))
print(is_prime_number(61))

# 실행결과
'''
소수가 아닙니다.
소수입니다.
'''

 

(5) 주어진 문자열에서 모음의 개수를 출력하는 함수를 만들어서 호출하여 그 결과를 출력하시오.

def count_vowel(txt):
    a = txt.count("a")
    e = txt.count("e")
    i = txt.count("i")
    o = txt.count("o")
    u = txt.count("u")
    return a+e+i+o+u

print(count_vowel("pythonian"))

# 실행결과
'''
3
'''

 

 


※ CMD에서 탐캣 실행하기 

 

(1) 탐캣 실행파일이 있는 경로에서 bin폴더까지의 경로를 복사한다. 

 

(2) CMD 창에서 해당 경로로 이동한다. 

    (이 때, JAVA_HOME의 환경변수가 잘못되어 있을 경우

     The JRE_HOME environment variable is not defined correctly 라는 에러가 발생할 수 있다. )

C:\java\tomcat\apache-tomcat-9.0.39\bin

 

(3) startup 이라고 입력시 startup.bat 파일을 실행하여 tomcat을 구동시킨다. 

C:\java\tomcat\apache-tomcat-9.0.39\bin>startup
Using CATALINA_BASE:   "C:\java\tomcat\apache-tomcat-9.0.39"
Using CATALINA_HOME:   "C:\java\tomcat\apache-tomcat-9.0.39"
Using CATALINA_TMPDIR: "C:\java\tomcat\apache-tomcat-9.0.39\temp"
Using JRE_HOME:        "C:\java\jdk_1_8_open"
Using CLASSPATH:       "C:\java\tomcat\apache-tomcat-9.0.39\bin\bootstrap.jar;C:\java\tomcat\apache-tomcat-9.0.39\bin\tomcat-juli.jar"
Using CATALINA_OPTS:   ""

 

(4) shutdown 이라고 입력시 shutdown.bat 파일을 실행하여 tomcat을 종료시킨다. 

C:\java\tomcat\apache-tomcat-9.0.39\bin>shutdown
Using CATALINA_BASE:   "C:\java\tomcat\apache-tomcat-9.0.39"
Using CATALINA_HOME:   "C:\java\tomcat\apache-tomcat-9.0.39"
Using CATALINA_TMPDIR: "C:\java\tomcat\apache-tomcat-9.0.39\temp"
Using JRE_HOME:        "C:\java\jdk_1_8_open"
Using CLASSPATH:       "C:\java\tomcat\apache-tomcat-9.0.39\bin\bootstrap.jar;C:\java\tomcat\apache-tomcat-9.0.39\bin\tomcat-juli.jar"
Using CATALINA_OPTS:   ""

 


10. 리눅스 쉘 프로그래밍 이론

 

  리눅스 = 커널 + 쉘 + 응용프로그램
  - 커널 : 핵심 구성
  - 쉘 : 커널(시스템)과 사용자 간의 인터페이스를 제공

 

※ 쉘 프로그래밍

 : 쉘에서 실행하도록 작성된 프로그램
 : 시스템을 컨트롤 할 수 있도록 해주는 프로그램이라고 보면 됨
 : 컴파일이 아니기 때문에 에러를 잡아주지 않아서 어렵다. 

 : 서버 작업 자동화에 사용될 수 있다. 

 

※ 쉘 스크립트

 : 구동이 빠르다. 단, 오타나 실수를 알 수 없어 개발이 어렵다. 

 

  . bat 은 윈도우에서 구동하는 파일
  . sh 는 리눅스에서 구동하는 파일

 


※ head 명령어를 사용하면 해당 파일에서 앞에서 10줄을 출력한다. 

[root@localhost ~]# head initial-setup-ks.cfg 
#version=DEVEL
# X Window System configuration information
xconfig  --startxonboot
# License agreement
eula --agreed
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
# Use graphical install

 

※ tail 명령어를 사용하면 해당 파일에서 뒤에서 10줄을 출력한다. 

[root@localhost ~]# tail initial-setup-ks.cfg 
%end

%addon com_redhat_kdump --enable --reserve-mb=auto
%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

 

※ head 명령어에 -num 옵션을 주면 입력한 숫자만큼의 라인을 출력한다. 

[root@localhost ~]# head -5 initial-setup-ks.cfg 
rsion=DEVEL
# X Window System configuration information
xconfig  --startxonboot
# License agreement
eula --agreed

 

 

 

※ echo 명령어는 ' ' 안의 문자열을 콘솔에 단순 출력한다. 

[root@localhost shelltest]# echo 'hello'
hello

 


12. 쉘 스크립트 작성 및 실행하기 - (1) - 쉘 스크립트 생성 및 실행하기

 

(1) 쉘 스크립트 작성시 사용할 디렉토리로 shelltest 를 생성한다.

[root@localhost ~]# mkdir shelltest
[root@localhost ~]# ls
anaconda-ks.cfg       shelltest  다운로드  바탕화면  사진  음악
initial-setup-ks.cfg  공개       문서      비디오    서식

 

(2) shelltest 디렉토리로 이동 후 경로를 확인한다. 

[root@localhost ~]# cd shelltest/
[root@localhost shelltest]# pwd
/root/shelltest

 

(3) gedit를 사용하여 test.sh 파일을 생성한다. 

[root@localhost shelltest]# gedit test.sh

 

(4) 쉘 스크립트인 test.sh에 내용을 작성한다. 

#!/bin/sh

# 위의 코드는 주석이 아니라 샤벵(셔뱅)이다.
# 기본 쉘로 /bin 디렉토리 아래에서 sh 를 사용한다는 선언문이다.

echo 'hello'
echo 'name:' $USERNAME
echo 'host:' $HOSTNAME

exit 0

 

(5) sh 명령어로 작성한 쉘 스크립트 test.sh를 실행할 수 있다. 

[root@localhost shelltest]# sh test.sh
hello
name: root
host: localhost.localdomain

 

(6) sh 명령어 없이 경로만으로 test.sh 를 실행하려고 하면 권한이 없어 실패한다. 

[root@localhost shelltest]# ./test.sh
bash: ./test.sh: 허가 거부
[root@localhost shelltest]# ll
합계 4
-rw-r--r--. 1 root root 227  1월  9 00:01 test.sh

 

(7) 사용자에 실행권한을 부여한다. 

[root@localhost shelltest]# chmod u+x test.sh
[root@localhost shelltest]# ll
합계 4
-rwxr--r--. 1 root root 227  1월  9 00:01 test.sh

 

(8) sh 명령어 없이 경로만으로 test.sh 를 실행할 수 있다. 

[root@localhost shelltest]# ./test.sh
hello
name: root
host: localhost.localdomain

 


13. 쉘 스크립트 작성 및 실행하기 - (2) 변수값 받아오기 및 사용자 입력값 출력하기

 

 

(1) gedit로 var1.sh 파일 생성 후 쉘 스크립트를 작성한다. 

[root@localhost shelltest]# gedit var1.sh

 

#!/bin/sh

myvar='Hello'

echo $myvar
echo "$myvar"
echo '$myvar'

exit 0

   ※ 이 때, = 앞 뒤로 공백이 없어야 한다. 

 

(2) sh 명령어로 실행한다. 

[root@localhost shelltest]# sh var1.sh
Hello
Hello
$myvar

   ※ echo 명령어로 출력시 작은 따옴표 ' ' 는 변수의 값을 불러오지 않고

      그 안의 문자열을 그대로 출력시키는 차이점을 확인할 수 있다. 

 

(3) gedit로 var1.sh 파일을 다시 열어서 사용자 입력값을 받고 확인하기 위한 스크립트를 작성한다. 

#!/bin/sh

echo 'input your name: '
read myvar
echo 'your name: '$myvar

 

(4) sh 명령어로 var1.sh 파일 실행시 사용자 입력값을 받아 변수 myvar에 담고 출력함을 확인할 수 있다. 

[root@localhost shelltest]# sh var1.sh
input your name: 
kim
your name: kim

 


14. 쉘 스크립트 작성 및 실행하기 - (3) 변수값 받아오기 및 사용자 입력값 넣기

 

(1) gedit로 numcal.sh 파일을 생성한다. 

[root@localhost shelltest]# gedit numcal.sh

 

(2) =과 + 앞뒤로 공백이 없도록 쉘 스크립트를 작성한다. 

#!/bin/sh

num1=100
num2=$num1+200

echo $num2

 

(3) sh 명령어로 numcal.sh 파일을 실행한다. 

[root@localhost shelltest]# sh numcal.sh
100+200

 

(4) `expr `을 사용하여 연산을 할 수 있다.

  `expr ` 내에서 연산자, 숫자, 변수, 기호 사이에 앞 뒤 공백 필수
  `expr ` 내에서 특수문자 사용시 역슬래시\ 필수 --- 괄호 (  ) 곱연산자 * 
#!/bin/sh

num1=100
num2=$num1+200
echo $num2

# num1+num2
num3=`expr $num1 + 200`
echo $num3

# (num1+200)/10*2
num4=`expr \( $num1 + 200 \) / 10 \* 2`
echo $num4

 

(5) sh 명령어로 numcal.sh 파일을 실행하여 연산 결과가 정상적으로 출력되는지 확인할 수 있다. 

[root@localhost shelltest]# sh numcal.sh
100+200
300
60

 


15. 쉘 스크립트 작성 및 실행하기 - (4) 명령행 매개변수를 받아 출력하기

 

 

(1) gedit로 var2.sh 파일을 생성한다. 

[root@localhost shelltest]# gedit var2.sh

 

(2) 출력하기 위한 기본틀을 쉘 스크립트로 작성한다. 

#!/bin/sh

echo 'filename : '
echo 'param : , param : '
echo $*

 

(3) sh 명령어로 var2.sh 파일을 실행하여 출력 결과를 확인한다. 

    $*는 인자를 모두 받아온다.

[root@localhost shelltest]# sh var2.sh
filename : 
param : , param : 

 

(4) sh 명령어로 var2.sh 파일 실행시 명령행 매개변수를 추가할 수 있다. 

[root@localhost shelltest]# sh var2.sh first second third
filename :
param : , param :
first second third

 

(5) var2.sh 파일에서 명령행 매개변수로부터 값을 출력하도록 쉘 스크립트를 수정한다. 

#!/bin/sh

echo 'filename : '$0
echo 'param : '$1 ', param : '$2
echo $*

 

(6) sh 명령어로 var2.sh 파일 실행하여 명령행 매개변수가 어떻게 적용되고 출력되는지 확인할 수 있다. 

[root@localhost shelltest]# sh var2.sh first second third
filename : var2.sh
param : first , param : second
first second third

 

sh var2.sh first second third
  0 1 2 3

※ 명령행 매개변수는 실행파일명부터 인덱스 0번이 부여된다. 

※ $*에는 인덱스 0번(파일명)을 제외한 나머지 명령행 매개변수가 담긴다. 

 

※ 쉘 스크립트에서 사전에 정의된 지역 변수

$$ : 쉘의 프로세스 번호
$0 : 쉘 스크립트의 이름
$1 ~ $9 : 명령줄의 매개변수
$* : 명령줄의 모든 매개변수 리스트
$# : 매개변수의 갯수

 

www.fun-coding.org/linux_basic3.html 쉘 스크립트 기본문법 참고

 

※ JAVA / Python / Shell script에서 명령행 매개변수의 인덱싱 차이

JAVA java hello 서버명 scott tiger
  . class 파일명 0 1 2
Python python hello.py 안녕 올라 헬로
  0 1 2 3
Shell Script sh var2.sh first second third
  0 1 2 3

16. 쉘 스크립트 작성 및 실행하기 - (5) if 조건식 제어문 

 

(1) gedit로 condi.sh 파일을 생성한다. 

[root@localhost shelltest]# gedit condi.sh

 

(2) 쉘 스크립트에서 조건식은 if로 시작하고 fi로 끝난다. 

  if [ 조건 ]
  then
      참인 경우
  else
      거짓인 경우
  fi

 

(3) 실행시 명령행 매개변수의 1번째와 2번째가 일치할 경우/ 불일치할 경우 각각 다르게 출력하도록

     조건식이 있는 쉘 스크립트를 작성한다. 

#!/bin/sh

if [ $1 = $2 ]
then
    echo "일치"
else
    echo "불일치"
fi    

   → = 과  == 둘 다 가능하다. 

   → $1 과  "$1" 둘 다 가능하다. 

   → '일치' 와  "일치" 둘 다 가능하다.

 

(4) sh 명령어로 condi.sh 파일을 실행할 때 명령행 매개변수를 함께 입력하여 결과를 확인한다. 

[root@localhost shelltest]# sh condi.sh Hong Hong
일치
[root@localhost shelltest]# sh condi.sh Hong gil
불일치

 


17. 쉘 스크립트 작성 및 실행하기 - (6) case 조건식 제어문 

 

(1) gedit로 condi2.sh 파일을 생성한다. 

[root@localhost shelltest]# gedit condi2.sh

 

(2) 쉘 스크립트에서 case문은 case로 시작하고 esac로 끝난다. 

  case  변수  in 
       경우1 )  명령문1 ;;
       경우2 )  명령문2 ;;
       * )  그 외 명령문 ;;
  esac

 

(3) 실행시 명령행 매개변수에 따라 다르게 출력하도록 case문이 있는 쉘 스크립트를 작성한다. 

#!/bin/sh

case "$1" in
    start) echo "시작합니다" ;;
    stop) echo "종료합니다" ;;
    *) echo "start 또는 stop을 입력해주세요" ;;
esac    

 

(4) sh 명령어로 condi2.sh 파일을 실행할 때 명령행 매개변수를 함께 입력하여 결과를 확인한다. 

[root@localhost shelltest]# sh condi2.sh start
시작합니다
[root@localhost shelltest]# sh condi2.sh stop
종료합니다
[root@localhost shelltest]# sh condi2.sh
start 또는 stop을 입력해주세요

 

 

반응형

'교육과정 > KOSMO' 카테고리의 다른 글

Day63  (0) 2021.01.12
Day62  (0) 2021.01.11
Day60  (0) 2021.01.07
Day59  (0) 2021.01.06
Day58  (0) 2021.01.05