기본 콘텐츠로 건너뛰기

벡터와 행렬에 관련된 그림들

bash 스크립트 소개

Shell 

shell은 당신이 명령어들을 사용하여 컴퓨터와 상호작용하도록 합니다. 데이터를 주고 받고 또는 저장하는 등의 간단한 작업에서 부터 매우 복잡한 작업등의 일을 할 수 있게 하지요.
터미널에서 date, cal, pwd, ls 등을 실행해 볼까요?
sgoing@sgoing-virtual-machine:~/문서/script$ date
2018. 10. 15. (월) 14:13:20 KST
sgoing@sgoing-virtual-machine:~/문서/script$ cal
      10월 2018       
일 월 화 수 목 금 토 
    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          
                     
sgoing@sgoing-virtual-machine:~/문서/script$ pwd
/home/sgoing/문서/script
sgoing@sgoing-virtual-machine:~/문서/script$ ls
a.log  b.log  bak  c.log  hello.sh

위와같이 터미널에 명령어를 입력하면 shell은 이 명령을 해석하여 kernel로 전달하고 kernel은 컴퓨터의 하드웨어에 명령에 부합하는 정보를 추출 또는 계산하여 다시 shell로 전달하고 이 결과를 모니터에 출력합니다.

Scripting

만일 위의 작업을 매일 한번 이상 자주 실행한다면 매번 위와 같은 작업을 반복하기란 번거롭지요. 만일 위의 명령들을 한번에 실행하도록 프로그램화 하여 저장한다면 편리할 것입니다. 이러한 작업을 스크립팅이라고 합니다.

실행

적당한 편집기로 파일을 작성한 다음 이렇게 만들어진 파일을 다음과 같이 실행파일로 만들어야 합니다.
"chmod +x 파일이름"
파일의 권한에 --x를 첨가하여mode를 변경하는 것 입니다. 권한에 --x가 있으면 실행파일 임을 의미합니다.
"./파일이름"
"./"는 파일을 실행하라는 명령어입니다.
편집기 nanno를 사용하여 test.sh파일을 생성합니다. 이 파일의 내용은 cat를 사용하여 확이할 수 있습니다.
sgoing@sgoing-virtual-machine:~/문서/script$ nano
sgoing@sgoing-virtual-machine:~/문서/script$ cat test.sh
date
cal
pwd
ls

test.sh 파일이 생성되었지만 그 권한을 보면 실행파일이 아닙니다.(--x 가 없습니다.)
sgoing@sgoing-virtual-machine:~/문서/script$ ls -l
합계 12
...
-rw-r--r-- 1 sgoing sgoing   16 10월 15 14:29 test.sh

그러므로 다음과 같이 하여 실행파일로 전환합니다.
sgoing@sgoing-virtual-machine:~/문서/script$ chmod +x test.sh
sgoing@sgoing-virtual-machine:~/문서/script$ ls -l
합계 12
...
-rwxr-xr-x 1 sgoing sgoing   16 10월 15 14:29 test.sh

이와 같이 변경한 후 실행 할 수 있습니다. 그 결과는 터미널에서 각각의 명령을 실행한 경우와 같습니다.
sgoing@sgoing-virtual-machine:~/문서/script$ ./test.sh
2018. 10. 15. (월) 14:35:00 KST
      10월 2018       
일 월 화 수 목 금 토 
    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          
                     
/home/sgoing/문서/script
a.log  b.log  bak  c.log  hello.sh  test.sh


bash 스크립트를 실행하는 다른 방법은  'bash 파일.sh' 입니다.
sgoing@sgoing-virtual-machine:~/문서/script$ echo data > date.sh
#echo date 는 화면에 date가 출력 이 결과를 date.sh라는 파일로 저장(redirection)
sgoing@sgoing-virtual-machine:~/문서/script$ cat date.sh
#! /bin/bash
date
sgoing@sgoing-virtual-machine:~/문서/script$ bash date.sh
2018. 10. 15. (월) 15:25:41 KST
sgoing@sgoing-virtual-machine:~/문서/script$ ./date.sh
bash: ./date.sh: 허가 거부
sgoing@sgoing-virtual-machine:~/문서/script$ chmod +x date.sh
sgoing@sgoing-virtual-machine:~/문서/script$ ./date.sh
2018. 10. 15. (월) 15:27:24 KST


bash?

bash는 shell을 통해 명령어를 kernel에 전달하는 과정에서 kernel이 이해할 수 있는 방식으로 해석하기 위한 해석기가 필요한데 그러한 해석기 중의 하나입니다. GNU/linux 체계에서 기본으로 장착되어 있는 해석기 입니다.
sgoing@sgoing-virtual-machine:~/문서/script$ echo $SHELL:
/bin/bash:

bash의 위치는 다음과 같이 확인할 수 있습니다.
sgoing@sgoing-virtual-machine:~/문서/script$ which bash
/bin/bash
각 해석기의 경우 명령어를 해석하는 방식에서 차이를 가집니다. 그러므로 스크립트를 작성할 경우 많은 어떠한 스크립트 언어(shell 해석기)를 사용하는지 지정해야 합니다. 즉, 다음과 같이 스크립트 상단에 기호"#!"와 같이 해석기의 경로를 작성해주어야 합니다.
"#! /bin/bash"

명령어 file은 파일의 종류를 결정합니다.
sgoing@sgoing-virtual-machine:~/문서/script$ file --help
Usage: file [OPTION...] [FILE...]
Determine type of FILEs.
...
sgoing@sgoing-virtual-machine:~/문서/script$ file test.sh
test.sh: ASCII text


주석(comments)

기호 '#'로 시작하면 주석입니다.

변수(Variables)

변수는 데이터를 저장하고 스크립트를 통해 수정된 결과를 나타내는 등 프로그래밍에서 중요한 요소입니다. 
sgoing@sgoing-virtual-machine:~/문서/script$ cat variables.sh
#!/bin/bash

greeting="Welcome" #문자열을 변수로 하는 객체 greeting생성
user=$(whoami) # whoami는 shell을 운영하는 컴 이름을 호출하는 명령어입니다.

#내장 함수 등의 프로그램 또한 변수를 호출할 경우 '$'와 함께 작성합니다.
day=$(date +%A)
#date 역시 날짜를 호출하는 명령어로서 +%A는 요일 만을 출력하라는 인자입니다.
#스크립트에서는 이름과 등호사이에 빈칸을 주지 않습니다.
echo "$greeting back $user! Today is $day, which is the best day of the entire week!"
echo "Your Bash shell version is: $BASH_VERSION. Enjoy!"

sgoing@sgoing-virtual-machine:~/문서/script$ ./variables.sh #./파일명 사이에 빈칸 없음
Welcome back sgoing! Today is 월요일, which is the best day of the entire week!
Your Bash shell version is: 4.4.19(1)-release. Enjoy!
sgoing@sgoing-virtual-machine:~/문서/script$ 


sgoing@sgoing-virtual-machine:~/문서/script$ date --help
사용법: date [옵션]... [+포맷]
  또는:  date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
...  %%   a literal %
  %a   locale's abbreviated weekday name (e.g., Sun)
  %A   로케일의 전체 요일 이름 (예., 일요일)
  %b   로케일의 줄인 월 이름 (예., Jan)
  %B   로케일의 전체 월 이름 (예., January)
  %c   로케일의 날짜와 시간 (예., 2005년 3월 3일 목요일 23시 05분 25초)
...

주의 : 변수이름에 대문자 사용은 에러를 일으킬 수 있습니다. 대문자 변수명은 internal shell variables로 예약되어 있습니다. 
이러한 프로그밍은 터미널에서 직접적으로 실행할 수 있습니다.
sgoing@sgoing-virtual-machine:~/문서/script$ a=1
sgoing@sgoing-virtual-machine:~/문서/script$ b=21
sgoing@sgoing-virtual-machine:~/문서/script$ echo $a
1
sgoing@sgoing-virtual-machine:~/문서/script$ echo $b
21
sgoing@sgoing-virtual-machine:~/문서/script$ echo $[$a + $b]
22

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...