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을 입력해주세요