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
댓글
댓글 쓰기