GNU/Linux 쉘프로그래밍 (Shell Programming) Seo, Doo-Ok Clickseo.com clickseo@gmail.com
목 차 유닉스쉘 GNU Bash 2
유닉스쉘 (1/10) 쉘 (Shell) 운영체제기능과서비스구현을위해인터페이스제공하는프로그램 명령어를실행시키는명령어해석기 사용자의명령어를입력받아기계어의형태로변환하여커널에전달하는인터페이스역할 쉘의종류 텍스트기반 CLI 쉘 유닉스쉘 윈도우명령프롬프트 그래픽기반 GUI 쉘 윈도우 PowerShell 윈도우탐색기 맥 OS 파인더 (Finder) 3
유닉스쉘 (UNIX Shell) Bourne Shell 계열 C Shell 계열 유닉스쉘 (2/10) 4
Bourne Shell 계열 : sh Bourne Shell : sh 유닉스쉘 (3/10) 1977년, AT&T Bell 연구소의개발자스티븐본 (Steven Bourne) UNIX Version 7 의기본쉘로톰슨쉘 (Thompson Shell) 을대체 대화형인터프리터로사용 제어흐름과변수를포함한프로그래밍이가능한스크립트언어로도사용 기본로긴쉘 : SunOS-5.x, FreeBSD 라이선스 : CDDL * 톰슨쉘 (Thompson Shell) 1971년, 켄톰슨 (Kenneth Thompson) 이개발하여최초유닉스버전에도입된최초의유닉스쉘 [ 출처 : Bourne shell", WIKIPEDIA ] 5
유닉스쉘 (4/10) Bourne Shell 계열 : ksh, bash Korn Shell : ksh -- kornshell.org 1983년, AT&T Bell 연구소의데이비드콘 (David Korn) 개발 Bourne Shell과하위호환되며, C Shell 의수많은기능을포함한다. 명령어완성기능, 히스토리기능 기본로긴쉘 : AIX, HP-UX 라이선스 : Eclipse Public License(EPL) GNU Bash(Bourne Again Shell) : bash 1989년, 브라이언폭스 (Brian Fox) 개발 Bourne Shell 을기반으로 GNU 프로젝트에의해개발 최종목적 : IEEE POSIX Shell과도구명세에호환되도록하는것 Bourne Shell의기능을추가발전시키면서, Korn Shell과 C Shell의유용한특징들도지원 쉘프로그래밍언어에있어서는 Bourne Shell 과호환 기본로긴쉘 : GNU/Linux, macos X 라이선스 : GNU GPL 6
유닉스쉘 (5/10) Bourne Shell 계열 : zsh Z Shell : zsh -- zsh.org 1990년, 폴팔스타드 (Paul Falstad) 가개발한확장형 Bourne Shell 강력한히스토리기능, 향상된명령행편집기능 파일명중간에서부터자동완성기능가능, 탭이나화살표키를이용해선택가능 라이선스 : MIT License 유형 프로그래밍언어 : C zsh : sourceforge.net https://sourceforge.net/projects/zsh/ [ 출처 : Z shell", WIKIPEDIA ] 7
유닉스쉘 (6/10) Bourne Shell 계열 : ash, dash A Shell(Almquist shell) : ash 1989년, 경량유닉스쉘 1990 년대초반릴리스된 BSD 버전유닉스에서기존 Bourne 쉘을대체 ash 파생판은 FreeBSD, NetBSD, DragonFly BSD, Minix, Android, 일부리눅스배포판에기본쉘 (/bin/sh) 로설치된다. 라이선스 : BSD License 유형 Debian A Shell(Debian Almquist Shell) : dash 1997 년, 최초버전발표이후 2002 년에 dash 로이름변경 Linux 배포판의 Ubuntu, Debian 및 POSIX 준수 8
유닉스쉘 (7/10) Bourne Shell 계열 : ash 파생판 다양한 A Shell(Almquist shell) 변형판 [ 출처 : "Ash (Almquist Shell) Variants", https://www.in-ulm.de/~mascheck/ ] 9
C Shell 계열 : csh, tcsh C Shell : csh 유닉스쉘 (8/10) 1978년, 빌조이 (Bill Joy) 가버클리버전유닉스의쉘로개발 C 언어와유사하며, 강력한프로그램작성기능, 대화식방식사용자환경 라이선스 : BSD License 프로그래밍언어 : C csh Repository : OpenGrok http://bxr.su/netbsd/bin/csh/ TC Shell : tcsh -- tcsh.org 1982 년, C Shell 기반의호환가능한유닉스쉘 프로그래밍가능한명령줄완성, 명령줄편집및기타몇가지기능을갖춘 C Shell 기본로긴쉘 : 초기버전의 macos X 라이선스 : BSD License 프로그래밍언어 : C tcsh Git : github.com https://github.com/tcsh-org/tcsh 10
다양한쉘정보 유닉스쉘 (9/10) 시스템에서사용가능한쉘확인 : /etc/shells [clickseo@localhost ~]$ cat > /etc/shells 현재쉘확인 [clickseo@localhost ~]$ echo $SHELL 11
유닉스쉘 (10/10) 다양한쉘정보 : 기본쉘변경 우분투리눅스기본쉘변경 [clickseo@localhost ~]$ sudo dpkg-reconfigure dash dpkg-reconfigure : 설치된패키지설정변경 리눅스쉘변경 : chsh 12
GNU Bash UNIX 쉘 GNU Bash 쉘프로그래밍 13
GNU Bash (1/11) GNU Bash : gnu.org/software/bash/ 1989 년 06 월, 브라이언폭스 (Brian Fox) 개발 최종목적 : IEEE POSIX Shell과도구명세에호환되도록하는것 Bourne Shell의기능을추가발전시키면서, Korn Shell과 C Shell의유용한특징들도지원 쉘프로그래밍언어에있어서는 Bourne Shell 과호환 Linux 배포판과 macos 에서기본쉘 윈도우 10 에서개발자들을위한도구로써 Bash 지원 GNU Bash 릴리즈 2016 년 09 월, Bash-4.4 2018 년 02 월, Bash-4.4.19 라이선스 : GNU GPL License 프로그래밍언어 : C Bash Git : savannah.gnu.org https://git.savannah.gnu.org/cgit/bash.git/ 14
GNU Bash (2/11) 리눅스를위한윈도우서브시스템 WSL(Windows Subsystem for Linux) 윈도우 10 및윈도우서버 2019 에서기본적으로리눅스바이너리실행파일을실행하기위한계층으로호환커널인터페이스를제공한다. Windows Services for UNIX 를대체 개발자모드및윈도우기능사용설정 1단계 : Windows 설정 > 업데이트및보안 > 개발자용 > 개발자모드 2단계 : 제어판 > 프로그램 > Windows 기능켜기 / 끄기 > Windows Subsystem for Linux 15
GNU Bash (3/11) 리눅스를위한윈도우서브시스템 : WSL 리눅스실행 WSL 를사용하여윈도우에서리눅스실행 [ 출처 : " 윈도우 10 에서 Bash shell 지원 ", developer.microsoft.com ] 16
환경설정파일 로긴쉘 (login shell) GNU Bash (4/11) /etc/profile ~/.bash_profile > ~/.bash_login > ~/.profile 로그인할때읽어들이는설정파일로사용자별환경설정 주요설정내용 : 검색경로, 터미널종류, 환경변수등 ~/.bashrc 새로운쉘이실행될때마다실행되며, 쉘을위한쉘스크립트로서브쉘 각종설정파일들은새로운사용자를등록하면, /etc/skel 디렉터리에기본값으로저장되어있는파일들을홈디렉터리에복사하여생겨나는것이다. 로그아웃 (logout) ~/.bash_logout 로그인쉘이종료되면서실행된다. 17
기타환경설정파일 /etc/profile.d 디렉터리 GNU Bash (5/11) 터미널을사용할때파일및디렉터리에대한색상설정 사용자언어설정 /etc/skel 디렉터리 슈퍼유저인 root 가새로운사용자생성시, 사용자별홈디렉터리에기본값으로복사될파일이존재하는디렉터리 18
GNU Bash (6/11) 내부명령어 (Built-in Command) 쉘프로그램자체적으로처리하는명령어 내부명령어 내용 cd pwd history exit echo 디렉터리변경현재작업디렉터리의절대경로출력이전에작업한명령어리스트출력종료문자열출력 read 사용자로부터값을읽어들인다. alias export set unset 명령어에대한별칭 (alias) 지정환경변수설정변수설정변수초기화 19
내부명령어 : enable 쉘내부명령어 GNU Bash (7/11) [clickseo@localhost ~]$ enable 20
내부명령어 : read read GNU Bash (8/11) C 쉘에서는 $< 을사용해사용자의입력을받았다. Bourne Shell 에서는 read 명령어를사용한다. #!/bin/bash echo n 당신의이름은? read name echo echo 당신의이름은 $name 입니다. 21
GNU Bash (9/11) 쉘활용 : 메타문자와역따옴표 명령어에메타문자사용 * : 길이에관계없이모든문자를가리킨다.? : 정하지않은하나의문자만을가리킨다. 명령어에역따옴표 (backquote) : [clickseo@localhost ~]$ date [clickseo@localhost ~]$ echo today is date [clickseo@localhost ~]$ echo today is`date` 22
GNU Bash (10/11) 쉘활용 : 리다이렉션과파이프라인 출력리다이렉션 (Redirection) : >, >> [clickseo@localhost ~]$ cat > test.text 파일에새로운내용을저장한다. [clickseo@localhost ~]$ cat >> test.text 이미작성되어있는파일내용뒤에첨부하는형식으로저장된다. 파이프라인 (Pipeline) : [ 명령 1] [ 명령 2] --> 명령 1 의결과가명령 2 의입력으로보내져처리된다. 23
GNU Bash (11/11) 쉘활용 : 무조건부와조건부실행 무조건부실행 : 쌍반점 (Semicolon) -- ; 앞명령의성공여부와상관없이무조건적으로실행된다. [ 명령 1]; [ 명령 2] --> 명령 1이실행된후에명령 2가실행된다. [clickseo@localhost ~]$ date > datae.txt; ls; cat date.txt 조건부실행 && : 이전명령에성공하면다음명령을실행 : 이전명령에실패할경우에다음명령을실행 24
GNU Bash 쉘프로그래밍 : 쉘변수 25
쉘변수 (1/7) 쉘변수 쉘변수는자료유형이없다 ( 즉, 아무값이나다넣을수있다 ). 쉘변수는기본적으로데이터를문자열로저장한다. 수치를대입해도실제수치가아닌문자열이저장된다. 계산이필요할경우는자동으로수치로변환하여계산후다시문자열로저장된다. 쉘변수는처음사용될때만들어진다 ( 즉, 미리선언할필요가없다 ). 쉘변수는유닉스명령과마찬가지로대소문자에구별이있다. 쉘변수의값을사용할때는변수명앞에 "$" 를붙여서사용한다. 쉘변수에값을대입할때는 "$" 를사용하지않는다. 26
쉘변수 (2/7) 환경변수 환경변수 $HOME $PATH $SHELL $BASH $BASH_VERSION $MAIL 사용자의홈디렉토리를설정실행프로그램의탐색경로현재쉘의경로와이름사용하고있는 Bash의쉘경로사용하고있는 Bash의버전전자우편보관파일의경로와이름 설명 $MAIL_CHECK 메일확인시간 ( 단위 : 초 ) $HOSTNAME $LS_COLORS $COLUMNS $ENV $HISTFILE $HISTSIZE 현재컴퓨터의이름 ls 명령을사용할때파일의종류마다나타나는색의결정터미널의행수환경지정파일의위치히스토리파일의경로히스토리의개수 27
쉘변수 (3/7) 환경변수 환경변수 설명 $LINES $MANPATH 터미널의라인수 도움말이있는경로 $PWD 현재위치 ( 절대경로 ) $UID $USER $USERNAME $PS1 사용자 UID 사용자 사용자이름 검색경로, 터미널종류, 환경변수등을설정하고, 그외로그인시점에실행시키고싶은명령, 시스템에대한정보를보여주는명령등을수행 28
환경변수 : 설정값 쉘변수 (4/7) 개별적으로환경변수설정값을확인 [clickseo@localhost ~]$ echo $ 변수명 29
환경변수 : 설정값 쉘변수 (5/7) 현재설정된환경변수값을모두확인 [clickseo@localhost ~]$ env 30
환경변수 : 설정값변경 쉘변수 (6/7) $ export [ 환경변수명 ]=[ 변수값 ] ~/.bash_profile 내의변수값설정 / 변경 사용예 [clickseo@localhost ~]$ export HISTSIZE=500 HISTSIZE 환경변수 1000 --> 500 으로변경 31
쉘변수 (7/7) 쉘의지역변수 이름 내용 $$ 쉘의 PID $0 쉘스크립트이름 $1 $n 명령어의 n번째인수 $* 명령어의모든인수목록 32
GNU Bash 쉘프로그래밍 : 제어흐름 33
쉘프로그래밍 (1/9) 조건문 산술비교연산자 비교연산자 설명 A eq B A ne B A gt B A lt B A ge B A le B 양변이같은지검사양변이다른지검사 A가 B보다큰지검사 A가 B보다작은지검사 A가 B보다크거나같은지검사 A가 B보다작거나같은지검사 34
조건문 : 선택문 쉘프로그래밍 (2/9) if ~ then if 조건 then fi 명령문 #!/bin/bash man=10 woman=20 if [ $man -lt $woman ] then echo woman fi 35
조건문 : 다중선택 if ~ then ~ elif ~ else 쉘프로그래밍 (3/9) #!/bin/bash man=10 woman=20 if [ $man -lt $woman ] then echo woman elif [ $man -eq $woman ] then echo same else echo man fi 36
조건문 : 다중선택 case 쉘프로그래밍 (4/9) ;; <-- C 에서의 break 와의미가같다. case $ 변수 in 패턴1: 명령문1;; esac 패턴 n: 명령문 n;; 37
쉘프로그래밍 (5/9) 반복문 : for for 문 지정된변수는 in 뒤에나오는문자를순서대로한단어씩받고, do 이후에나오는명령문을입력받은문자가없을때까지반복수행한다. for 변수 in list1 list2 list3 do 명령문 done #!/bin/bash for i in n e n i o n do echo $i done 38
반목문 : while while 문 쉘프로그래밍 (6/9) 해당조건을만족하는동안 do 이후에나오는명령문을반복수행한다. while 조건문 do 명령문 done #!/bin/bash loop=1 while [ $loop -lt 5 ] do echo This is a while test $loop let loop=loop+1 done 39
반복문 : until until 문 쉘프로그래밍 (7/9) 해당조건을만족할때까지 do 이후에나오는명령문을반복수행한다. until 조건문 do 명령문 done #!/bin/bash loop=10 until [ $loop -lt 5 ] do echo This is a until test $loop let loop=loop-1 done 40
함수 (Function) 쉘프로그래밍 (8/9) 함수 : 서브루틴으로, 어떤동작들이구현된코드블록 function 함수명 { 명령문 } #!/bin/bash function exam1 { exit } function exam2 { echo Excute Function!! } exam2 exam1 echo Final 41
쉘프로그래밍 (9/9) 디버깅 디버깅이란? 컴퓨터프로그램이나하드웨어장치에서잘못된부분, 즉버그를찾아서수정하거나또는에러를피해나가는처리과정 #!/bin/bash -x 42
참고문헌 [1] 이종원, IT CookBook, 우분투리눅스 ( 개정판 ) : 시스템 & 네트워크, 한빛아카데미, 2018. [2] 백창우, 유닉스리눅스프로그래밍필수유틸리티, 한빛미디어. 2010. [3] "GNU Operating System", Free Software Foundation(FSF), 2018 of viewing the site, https://www.gnu.org/. 이강의자료는저작권법에따라보호받는저작물이므로무단전제와무단복제를금지하며, 내용의전부또는일부를이용하려면반드시저작권자의서면동의를받아야합니다. Copyright Clickseo.com. All rights reserved. 43