Unix(Linux) shell programming 실험 – 5 Unix(Linux) shell Programming Dept. of Computer Science, Sogang Univ.
3-1. UNIX System 소개 Unix란 주로 중대형 컴퓨터및 워크스테이션에서 많이 사용하는 OS Linux – 일반 PC에서 주로 사용되는 Unix Unix 의 역사 60년대 AT&T의 Bell 연구소에서 개발한 Multics 운영체제가 너무 복잡하여 개발하게 되었다. 1971년 Bell 연구소에서 유닉스 시스템의 최초의 버전이 나오게 되었다. C 언어가 유닉스에서 쓰이기 위해 개발되고, 유닉스 운영체제도 C로 다시 프로그램 되었다. 인터랙티브 시스템사가 1977년 유닉스를 사무자동화를 위한 상업용으로 팔기 시작하였다. System V vs. BSD Solaris (Sun), IRIX (IBM), HP-UX (HP), …
Unix System 기초 접속 방법 원격 접속 방법 터미널 접속 방법 telnet ssh 터미널 접속 방법 서버에 직접 연결되어 있는 모니터와 키보드, 마우스를 통해 연결 일반 사용자들은 Unix System 에 접속하기 위해서 보통 원격 접속 프로그램을 사용한다. zterm, putty, SSH Secure Shell Client, SecureCRT, Xmanager 등
Unix System 기초 zterm을 이용한 실행 zterm은 콘솔용 프로그램이다. zterm 실행화면
Unix System 기초 zterm을 이용한 실행 zterm 작업화면
Unix System 기초 Xmanager를 이용한 접속 Xmanager는 원격에서 Unix System에 GUI모드로 접속할 수 있게 해주는 프로그램이다. Xbrouser 실행 결과.
Unix System 기초 Xmanager를 이용한 접속 Xmanager 실행화면
1. 주소창에 cspro.sogang.ac.kr 을 입력한다. Unix System 기초 Putty를 이용한 접속 Session Save 기능 활용하기 Unix 서버에 접속 할 때 주로 이 프로그램을 많이 이용한다. 1. 주소창에 cspro.sogang.ac.kr 을 입력한다. 2. ssh 프로토콜을 선택한다. 3. Open 버튼을 누른다.
1. 주소창에 cspro.sogang.ac.kr 을 입력한다. 저장된 Session명을 클릭 후 open을 클릭한다. Unix System 기초 Putty의 Session Save 기능 활용하기 1. 주소창에 cspro.sogang.ac.kr 을 입력한다. 2. ssh 프로토콜을 선택한다. 3. Session 명을 적는다. 4. Save 버튼을 누른다. 접속방법 1. 저장된 Session명을 더블클릭 한다. 접속방법 2. 저장된 Session명을 클릭 후 open을 클릭한다. Page 9
Unix System 기초 로그인하기 아래와 같이 login창이 뜨면 자신의 id와 password를 입력한다.
Unix System 기초 Putty에서 한글보이게 하는 방법 한글 putty를 다운로드 받아 사용(권장) 윈도우 시작메뉴에서 '실행' 메뉴 클릭 → 'regedit'를 적고 확인을 누름 → regedit → HKEY_CURRENT_USER → Software → SimonTatham → PuTTY → Sessions → 설정을 원하는 세션선택 → FontCharSet 16 진수 0 을 16 진수 81 로 변경 Category에서 Window 선택 → Appearance → Font Setting → Change → 굴림 → 스크립트 : 한글 → 다시 session tab 으로 와서 cspro로 접속 Page 11
Unix System 기초 SSH Secure Shell을 이용한 접속 SSH Secure Shell프로그램을 설치한 뒤 Secure Shell Client프로그램을 실행한다. 아래와 같은 창이 뜨면 Quick Connect 버튼을 누른 뒤 Host name에 cspro.sogang.ac.kr을 입력하고, User Name에 자신의 login id를 입력한 뒤 Connect버튼을 누른다. 1. Quick Connect버튼을 누른다. 2. Host name에 cspro.sogang.ac.kr을 입력하고, User Name에 자신의 login id를 입력한 뒤 Connect버튼을 누른다. FTP 사용법 알려주기 – 폴더 사용법, 권한 설정하는 방법 등 3. 자신의 password를 입력한 뒤 OK버튼을 누른다.
SSH Secure Shell 이용 아래와 같은 창이 뜨면 Quick Connect 버튼을 누른 뒤 Host name에 cspro.sogang.ac.kr을 입력하고, User Name에 자신의 login id를 입력한 뒤 Connect버튼을 누른다. 0. 이 버튼을 클릭한다. 1. Quick Connect버튼을 누른다. 2. Host name에 cspro.sogang.ac.kr을 입력하고, User Name에 자신의 login id를 입력한 뒤 Connect버튼을 누른다. 3. 자신의 password를 입력한 뒤 OK버튼을 누른다.
Unix System 기초 Shell Shell은 unix OS와 사용자 간에 대화 소통을 원활하게 해주는 역할을 한다.
Unix System 기초 Shell (Cont’) sort –n phonelist > phonelist.sorted 명령행을 sort, -n, phonelist, >, phonelist.sorted와 같은 조각으로 나눈다. 이러한 조각들을 워드(word) 라 한다. 각 워드가 의미하는 바를 파악한다. > phonelist.sorted에 따라 I/O를 설정한다. sort 명령을 –n 옵션으로 하고 phonelist를 인자로 하여 실행한다. 종류 Bourne Shell (sh), C Shell (csh), Korn Shell (ksh), Bourne Again Shell (bash), tcsh등
Unix System 기초 명령어 실행 Shell 은 입력 받은 명령어를 해석, 실행하고 그 결과를 돌려주는 역할을 수행한다. 예제
Unix System 기초 Standard Input/Output/Error, Redirection, Pipe Unix 에서 명령어는 Standard Input을 통해서 입력받고, 처리된 결과는 Standard Output을 통해서 출력된다. 발생한 error 는 Standard Error를 통해 출력된다. 파일을 통해서 입력이 되거나 출력을 파일로 저장하고자 할 때 Redirection(<, >)을 이용한다.
Unix System 기초 Standard Input/Output/Error, Redirection, Pipe
Unix System 기초 Standard Input/Output/Error, Redirection, Pipe Pipe(|, shift + \)를 이용하면 한 명령의 표준 출력을 다른 명령의 표준 입력으로 보낼 수 있다. Pipe 처리 과정
Unix System 기초 Meta Character 특수문자 용도 cmd; Command terminator cd; ls execute sequentially cmd & Run preceding command in the background > file Output redirection >> file Appending output redirection < file Input redirection << word Read standard input up to a line identical word cmd | cmd From a pipeline between preceding command and the following command * The * is used in file name generating to the match any sequence of characters ls new* ? The ? Is used in file name generation to match any single character in a file name ls new?
Unix System 기초 Meta Character [set] The [introduces a character set for file name generation and]closes the set ls [D-R]* - Indicates a character range in a character class $word The word following the $ will be treated as a parameter and will be replaced by its value c The character following the backslash will be quoted ‘text’ No substitutions will occur “text” Parameter and command substitution occur (list) Execute a command list in a subshell (date; who; pwd) > file {list} Execute a command list in the current shell cmd && cmd Execute the second command only if the first completes with zero exit status cmd || cmd Execute the second command only if the first completes with a non-zero exit status
Unix System 기초 파일 시스템 Path name /home/lazylune/project/os/hw3/ Unix에는 디렉토리를 나타내는 특수한 문자가 존재한다. “.”은 현재 디렉토리를 나타내며 “..”은 현재 디렉토리의 상위 디렉토리를 나타내고, “~”는 home 디렉토리를 나타낸다. 절대 경로 (root로부터 시작) /home/lazylune/project/os/hw3/ 상대 경로 ../../../../os/hw3 ~/project/os/hw3 (현재 로긴되있는 계정의 홈디렉토리) ~lazylune/project/os/hw3 (~username 해당유저의 홈디렉토리를 나타내는 상대경로)
Unix System 기초 파일 시스템 Permission Unix는 multi-user System 이다. 따라서 사용자가 자신의 Directory와 File에 접근하는 위험이 항시 존재한다. Permission 이란 해당 파일에 대한 접근 권한을 뜻한다. 파일에 점근하는 사용자를 크게 소유자, 그룹, 다른 사용자의 3가지로 분유하여 각각에 대하여 읽기, 쓰기, 실행 권한을 줄 수 있다. 예 > drwxr-xr-x
Unix System 기초 Unix System Directory 구조 Unix 디렉토리 구조
Unix System 기초 Unix System Directory 구조
Unix System 기초 Unix System Directory 구조
Unix 기본 명령어 ls : dir과 동일한 명령어. 현재 폴더에 들어있는 파일들의 목록을 보여줌. ls –al : 숨김 파일, 권한 설정 등 파일의 자세한 정보와 함께 파일들의 목록을 보여줌 passwd : 자신의 비밀번호를 변경. (cspro에서만 가능, cspro1, cspro2.. 는 불가) pwd : 현재 위치를 확인 who : 현재 접속한 user의 정보 확인 cp : 파일 복사 mv : 파일 이동 rm : 파일 삭제 (하위 디렉토리까지 지우려면 rm -rf ) mkdir : 디렉토리 생성 rmdir : 디렉토리 삭제 (해당 폴더에 파일이 들어있으면 지울 수 없다. 이때는 rm -rf 사용) cd : 작업 위치를 변경 “cd” 만 칠 경우 자신의 홈디렉토리로 이동. “cd 디렉토리”를 치면 해당 디렉토리로 이동. “cd .."을 입력할 경우 한 단계 상위 디렉토리로 이동 exit : 현재 세션 종료 ps (ps -aux) : 현재 수행중인 프로세스 목록 kill : 해당 프로세스를 강제 종료 ./파일명 : 파일 실행 Passwd 변경하는 방법 자세히 적고 직접 보여줄 것
vi 설정 및 사용법 vi 기본 사용법 vi는 Visual display editor로 유닉스 상에서 가장 널리 쓰이는 텍스트 편집기임. Unix의 vi가 소스코드가 공개되지 않은 관계로 Linux 상에서는 vi 역할을 하는 Vim (Vi Improved)이라는 텍스트 편집기를 사용. linux에서 vi 명령어를 치면 vim이 실행됨. 보통 “vi 파일이름”으로 실행시킨 후 저장 후 종료하면 해당 파일이 생성됨. 실행화면
vi editor 기본 명령어 vi에는 명령 모드, 입력 모드, 콜론 모드 이렇게 3가지 명령어 모드가 있다. 콜론모드 입력모드 명령모드
vi 명령어 - 입력모드 입력 모드 전환 i : 커서 바로 앞부터 입력 모드로 전환 a : 커서 바로 뒤부터 입력 모드로 전환 A : 커서가 있는 줄 맨 뒤부터 입력 모드로 전환 o : 현재의 줄 아래에 새로운 줄을 만들어 입력 모드로 전환 O : 현재의 줄 위에 새로운 줄을 만들어 입력 모드로 전환 ※ vim에서는 입력모드로 전환 후 backspace나 delete key를 사용 가능 (vi에서는 불가능)
vi 명령어 - 콜론모드 콜론모드로 전환 저장 종료 찾기 ‘Esc’key를 누르고 ‘:’(콜론)을 입력 wq : 저장 후 종료 (or shift + zz) w : 저장 (종료하지 않음) w + 파일명 : 새이름으로 저장 종료 qw : 저장 후 종료 q! : 저장하지 않고 강제 종료 찾기 / + 텍스트 : 텍스트를 본문에서 검색 n : 다음 찾는 곳으로 이동
vi 명령어 - 명령모드 페이지 이동 실행 취소 블록 선택 행번호 + G : 행번호를 입력하고 Shift +g를 입력하면 해당 라인으로 이동 ctrl + F : 다음 화면으로 이동, Page Down (혹은 Page Down key) ctrl + B : 이전 화면으로 이동, Page UP (혹은 Page Up key) 실행 취소 u : 실행 취소 U : 전체 실행 취소 블록 선택 v : 현재 위치부터 커서의 이동에 따라 영역을 블록 선택 V : v와 동일하나 라인 단위로만 선택 가능 (선택 후 선택한 영역만 삭제하거나 복사할 수 있음) (c 언어 프로그래밍 시 블록 선택 후 “=”key를 눌러 indentation을 맞출 수 있다. )
vi 명령어 - 명령모드 삭제 (잘라내기) 복사 붙여넣기 dd : 한줄 삭제 dw : 한 단어 삭제 (숫자 + dw로 숫자만큼의 단어 삭제) x : 커서가 있는 문자 삭제 (Delete key) X : 커서 앞문자 삭제 (Back Space key) (삭제 명령어는 윈도우의 잘라내기와 동일. 붙여넣기로 다른 곳에 붙일 수 있음) 복사 yy : 현재 라인 복사 숫자 + yy : 현재부터 아래로 숫자만큼의 라인 복사 yw : 현재 단어 복사 숫자 + yw : 현재부터 뒤로 숫자만큼의 단어 복사 붙여넣기 p : 현재 커서 다음 줄에 붙여넣기 P : 현재 커서 이전 줄에 붙여넣기
.vimrc 설정법 기본 자신의 홈 디렉토리로 이동 (cd ) ls -al을 쳐보면 .vimrc 는 기본으로 폴더에 들어있지 않음 vi .vimrc를 입력하여 .vimrc 생성 .vimrc 설정 set shiftwidth=4 - 자동 들여쓰기를 할 때 4칸 들여 쓰도록 한다. set number – 행 번호를 사용한다. set nobackup - 백업파일을 생성하지 않는다. set fileencoding=euc-kr - 실제로 파일을 저장할 때 사용되는 인코딩은 euc-kr set background=light - 하이라이팅 옵션 lihgt or dark set expandtab - 탭을 입력하면 공백문자로 변환하는 기능을 설정 set hlsearch - 검색어를 구문강조해주는 기능 set ignorecase - 검색할 때 대소문자 무시하도록 하는 것.
3-2. Shell 프로그래밍 개요 쉘은 인터프리터 언어이다. 즉 컴파일을 필요로 하지 않는다. 쉘 프로그래밍의 필요성 Unix 는 기본적으로 작고 간단한 역할을 수행하는 프로그램으로 이루어져 있다. 어떠한 작업을 수행하기 위해선 기존의 Unix 프로그램들을 구조적으로 연결하여 조립할 필요가 있다. 복잡한 작업을 위해 프로그램의 제어와 사용자와의 상호작용 등이 필요로 하고 이를 위해 명령어들을 스크립트로 작성하여 실행하도록 한다.
Shell Programming - 문법 변수 선언과 할당 Bourene shell 에서는 변수를 선언하지 않고 사용할 수 있다. 변수의 이름은 암묵적으로 대문자를 많이 사용한다.
Shell Programming - 문범 변수 선언과 할당
Shell Programming - 문법 변수 Exporting shell variables
Shell Programming - 문법 변수 Automatic shell variables
Shell Programming - 문법 변수 Automatic shell variables Page 40
Shell Programming - 문법 변수 Automatic shell variables
Shell Programming - 문법 변수 Standard shell variable
Shell Programming - 문법 변수 Quoting special characters Backslash(\) – 한 문자에 대하여 meta character 에 관계없이 있는 그대로 하나의 문자로 인식한다. Single quote(‘ ‘) – single quote 내에 있는 문자열을 있는 그대로 처리한다. Double quote(“ “) – double quote 내에 있는 변수를 변수 값으로 치환하여 처리한다.
Shell Programming - 문법 조건문 if
Shell Programming - 문법 조건문 if (Cont’)
Shell Programming - 문법 반복문 for
Shell Programming - 문법 반복문 While and until
Shell Programming - 문법 선택문 case
Shell Programming - 문법 함수
프로그래밍 문제 온라인 전화/주소록 입출력 형식 전화번호와 주소록이 기록되어 있는 데이터 파일이 있다. 사람의 이름, 주소, 전화번호의 일부분이 입력으로 주어지면 데이터 파일에서 입력과 맞는 데이터를 검색하여 포맷에 맞게 출력한다. 스크립트 파일명은 “phone”으로 한다. 입출력 형식 데이터 파일 형식: 각 줄마다 하나의 레코드가 “이름|주소|전화번호” 로 입력된다. 입력형식: 쉘프롬프트 상에서 한 개 이상의 인자(argument)로 주어진다. 출력형식: 검색된 레코드를 아래 예와 같이 출력한다. 만약 검색된 레코드가 없다면 아무것도 출력하지 않는다.
프로그래밍 문제 입출력 형식 (Cont’) 데이터 파일예 홍길동|서울시 마포구 신수동 서강대학교 AS관 301호|02-705-2665 Andrew|경기도 의정부시 호원동 23-12번지|031-827-7842 입력예 ./phone 홍길동 신수동 ------- name: 홍길동 address: 서울시 마포구 신수동 서강대학교 AS관 301호 phone: 02-705-2665 ------- 출력예
프로그래밍 문제 문제 해결 방법 에러처리: 반드시 하나이상의 인자를 필요로 하며, 해당 인자가 주어지지 않은 경우 다음과 같이 사용 예(usage)를 출력해 준다. 입력 인자 변경: egrep 을 사용하기 위해 모든 인자를 다 붙여서 하나의 문자열로 만들어야 한다. 해당 데이터 추출 및 출력: egrep을 통해 원하는 데이터를 추출하고 포맷에 맞게 출력해야 한다. 포맷을 맞추는 것은 awk 프로그램을 이용할 수 있다. Field의 구분자로 “|”를 사용해야 하며 이것은 BEGIN {} 내에 FS=“|”; 를 넣어주면 된다. Stripping off the head of a pathname: basename (e.g. name=“`basename $0`”) 입력예 ./phone Usage: phone searchfor [… searchfor] (You didn’t tell me what you want to search for.) 출력예 egrep –i “(arg1|arg2|…|argn)” datafile 과 같이 사용되어야 하므로 ./phone arg1 arg2 … argn 에서 (arg1|arg2|…|argn) 으로 고쳐줘야 한다
awk Programming language designed to make many common information retrieval and text manipulation tasks easy to state and to perform Basic operation: scan a set of input lines in order, searching for lines which match any of a set of patterns which the user has specified Usage awk ‘program’ [ datafile ] awk –f program [ datafile ] 예 {print $1, $2, $3}
프로그래밍 숙제 파일명에서 대문자는 소문자로, 소문자는 대문자로 바꾸기 입출력 특정 디렉토리 내에 있는 모든 파일들을 대문자 소문자로 바꾸는 스크립트를 작성한다. 입출력 입력: 스크립트를 수행하면 수행하고자 하는 디렉토리의 위치를 사용자로 부터 받는다. 아무것도 입력하지 않고 Enter를 누르면 현재 디렉토리 상에서 수행된다. 출력: ls 명령으로 디렉토리의 파일의 목록을 확인하였을 때 모든 파일명이 대문자 소문자로 바뀌어 있어야 한다. 예;
프로그래밍 숙제 입출력 (Cont’) $ls 예 $ls Apple.txt BABO LoWerCase Upper utol.sh sweetPotato.Exe $./utol.sh working directory: /home/jhyang/ULdata aPPLE.TXT babo lOwERcASE uPPER UTOL.SH SWEETpOTATO.eXE
프로그래밍 숙제 힌트 주의사항 디렉토리 내의 모든 파일 access: 파일이름 변경: tr (translate/delete characters) 사용 주의사항 디렉토리 input이 있는 경우에는 해당 디렉토리가 존재하는지 (혹은 존재해도 갈 수 있는지) 확인하고 change directory가 불가능하면 error message를 주어야 한다. for i in * do … done tr char1 char2