SHELL programming
Content Shell 이란? Redirection & Pipes Shell Programming 변수 조건 프로그램제어 리스트 함수 Shell 에내장된명령 Here documents Page 2
Shell 이란? User 와 UNIX(Linux) 사이의인터페이스로작동하는프로그램. 사용자는 shell 을통하여 OS 가실행할명령을입력 Windows(command 환경 ) 의명령프로프트와비슷 [ue20@zeus ~]$ vs. C:\windows>_ 대부분의 shell 들은 Bourne shell 로부터파생됨 bash, csh, sh(bourne) shell etc. Shell 은두가지역할을한다. 명령어처리기 고급프로그래밍언어 [ 실습 1] 현재사용중인 bash 쉘의버전확인 [ue20@zeus ~]$ /bin/bash --version Page 3
Redirection & Pipes File Descriptor Process 가 File 이나 Device 를 access 하기위해사용 Standard File Descriptor stdin(0) : 표준입력 ( 예, 키보드 ) stdout(1) : 표준출력 ( 예, 모니터 ) stderr(2) : 표준에러출력 ( 예, 에러메시지 ) Redirection 출력재지정 입력재지정 >, >> (stdout 을파일로저장또는추가 ) < ( 파일을 stdin 으로전달 ) Pipe ( ) Process 연결 (stdout 을 stdin 으로전달 ) Process 간의데이터흐름은자동으로조절됨 Page 4
Redirection & Pipe 실습 현재위치에서다음과 같같이입력 ps 명령어 : 시스템내에서현재진행중인프로세서를보여준다. [ue20@zeus ch2]$ ls al > lsoutput.txt [ue20@zeus ch2]$ more lsoutput.txt more 또는 cat 명령어를통해 lsoutput.txt 내용을확인 [ue20@zeus ch2]$ more < lsoutput.txt [ue20@zeus ch2]$ ps >> lsoutput.txt [ue20@zeus ch2]$ more lsoutput.txt vim lsoutput.txt 내용 more( 또는 cat) lsoutput.txt 내용 Page 5
Redirection & Pipe 실습 여러파일검색 Pipe find. -iname *.txt xargs grep asdf $ cal > foo $ cat /dev/zero > foo $ cat < /etc/passwd $ who cut -d' ' -f1-4 sort uniq wc l backtick $ echo The date is `date` $ echo `seq 1 10` Hard, soft (symbolic) link ln vmlinuz-2.6.24.4 vmlinuz ln -s firefox-2.0.0.3 firefox
Shell Programming Shell Programming 두가지방법 명령을차례 (line command) 로입력하고 Shell 이대화형으로실행 하나의스크립트작성후프로그램처럼사용 Script 작성 실행파일로만들기 실행 [ue20@zeus ch2]$ for file in * > do > if grep l ps $file > then > more $file > fi > done Page 7 예 1. Line command 줄바꿈위치중요! 줄바꿈대신 ; 사용가능 예 2. Script 를이용 [ue20@zeus ch2]$ vi first #!/bin/bash for file in * do if grep -l ps $file then echo $file fi done exit 0 [ 실행 ]$ /bin/sh first
Python version : test.py #!/usr/bin/python import os import subprocess as sp for filen in os.listdir("."): if sp.call("grep l ps '"+filen+"'>/dev/null", shell=true)==0: print(filen) 들여쓰기중요! 들여쓰기시탭또는스페이스여러개사용할수있는데, 코드전체에서방식을하나로통일해야함 #!/usr/bin/python import os import subprocess print(subprocess.check_output( ls l, shell=true) os.system( ls l ) Page 8
Shell 문법 변수 : 문자열, 숫자, 환경, 매개변수 조건 : 쉘부울 (Boolean) 프로그램제어 : if, elif, for, while, until, case 리스트 함수 쉘에내장된명령 명령의결과가져오기 Page 9
Shell 변수 Shell 변수 Shell 에서변수는사용할때선언 변수에초기값을대입할때변수를만들게된다 모든변수는문자열로간주한다. 숫자값을가지는경우에도문자열로간주된다. 변수는대소문자를구분한다. ( 리눅스시스템특성 ) 변수에값이부여될때를제외하고, 변수를사용할경우변수앞에 $ 의표시를붙여야한다. 변수에부여된값은 echo 명령을통해확인가능. 변수에저장될문자열값중빈칸을포함하고있다면 을이용하여값을부여한다. Page 10
쉘변수실습 실습 4. 명령줄 (command line) 에변수에같값을설정하고 each 로확인하기 [ue20@zeus ch2]$ VAR=Hello 값을설정할때띄워쓰면에러발생 [ue20@zeus ch2]$ echo $VAR Hello [ue20@zeus ch2]$var= Hello Hanyang Univ [ue20@zeus ch2]$ echo $VAR Hello Hanyang Univ Page 11
쉘변수실습 실습 5. 스크립트를작성해서다양한출력형태확인 [ue20@zeus ch2]$ vi var_example.sh myvar= Hi Hanyang Univ echo $myvar echo $myvar echo $myvar echo \$myvar echo Enter some text read myvar echo $myvar now equals $myvar exit 0 Page 12
Python version #!/usr/bin/python import os print(os.getenv( HOME )) Print Enter some text myvar=raw_input() print(myvar) Page 13
Shell 환경변수 Shell 의환경변수 Shell Script 가시작될때일부의변수는환경의값을통해초기화되는데, 이를환경변수라한다. 사용자정의 ( 쉘 ) 변수와구분하기위해보통대문자로선언 환경변수는각사용자환경에따라값이다르다. Page 14 환경변수 $HOME $PATH 설명 현재사용자의홈디렉토리 명령을검색하는디렉토리들의목록, : 으로구분된다 $PS1 대개 $ 인명령프롬프트 $PS2 추같적인입력을요구할때사용되는 2 차프롬프트, 주로 > 이다. $IFS 입력필드구분자. Shell 이입력을받아들일때단어를구분하는데사용되는문자의목록으로, 대개빈칸, 탭, 새줄문자이다. $0 Shell Script 의이름 $# 전달된파라미터의수 $$ /tmp/tmpfile_$$ 와같같이종종독특한임시파일이름을생성하기위해 Script 에서사용되는 Shell Script 의프로세스 ID
Shell 환경변수실습 실습 6. 환경변수이해하기 [ue20@zeus ch2]$ echo $PATH /usr/kerberos/bin:/usr/local/bin:/bin/:/usr/bin:/usr/x11r6/bin:/home/ue20/bin [ue20@zeus ch2]$ echo $HOME /home/ue20 [ue20@zeus ch2]$ cat ~/.bashrc #Get the aliases and functions if [ -f ~/.bash_aliases ]; then ~/.bash_aliases fi #User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH [ue20@zeus ch2]$ Page 15
Python script 에서 bash 로환경변수 export 는불가능함 ( 단, bash script 와 python script 를동시에사용하면가능 ) Page 16
Shell 파라미터변수 Shell 의파라미터변수 Script 가파라미터를통해호출된다면몇가지추가적인변수가생성되는데이를파라미터변수라한다. 파라미터변수 설명 $1, $2,.. Script 에주어진파라미터 $* 환경변수 IFS 의첫문자로구분되고, 하나의변수에저장되는모든파라미터의목록 $@ IFS 환경변수를사용하지않는 $* 에대한변형 Page 17
Shell 파라미터변수 파라미터변수실습 Shell 상태에서다음과같이명령을실행한다. $IFS=h # 환경변수 IFS 를 h 로초기화한다. $set foo bar bam # 파라미터설정. $echo $@ $echo "$@" $echo $* $echo "$*" $unset IFS $echo $@ $echo $* $echo "$@" $echo "$*" Page 18
Shell 파라미터변수실습 실습 7. 매개변수와환경변수 [ue20@zeus ch2]$ vim vitry_var.sh salutation= Hello echo $salutation echo The Program $0 is now running echo The Second parameter was $2 echo The First parameter was $1 echo The user s home directory is $HOME echo Please enter a new greeting read salutation echo $salutation echo The script is now complete exit 0 Page 19
Shell 파라미터변수실습 실습 7. 매개변수와환경변수결과확인 사용자입력 사용자작성스크립트 chmod 명령을통해권한변경후수행같능하게만들기 [ue20@zeus ch2]$ ls -l [ue20@zeus ch2]$ chmod +x vitry_var.sh [ue20@zeus ch2]$ ls l [ue20@zeus ch2]$./vitry_var.sh Hanyang Univ. Page 20
Python 파라미터변수실습 #!/usr/bin/python import os,sys,string print(sys.argv) print(len(sys.argv)) try: print(string.join(sys.argv, ' ')) print('a') print(sys.argv[0]) print(sys.argv[1]) print(sys.argv[2]) os.system('ls') except Exception: pass Page 21
Shell 조건문 Shell Bool 형확인기능 [], test test, [] 는어떤표현식이나파일에대해산술비교스트링비교, 파일조건등을확인하고그에대해참또는거짓의값을리턴 예 ) 파일의존재유무를확인하는 test 명령사용법 : test f <filename> 조건형식 방법 1. 기본형 if test f fred.c then fi 방법 2. 축약형 if [ -f fred.c] then fi 문자열비교, 산술비교, 파일조건 (p79 ~ 80 table 참고 ) Page 22
Shell 제어구조 If 명령의결과를테스트하고조건부로구문의그룹을실행한다. If 구문 if condition then statements else Statements fi Page 23
If 조건문실습 실습 8. 간단한 if 조건문사용 [ue20@zeus ch2]$ vim ch2_if.sh #!/bin/sh echo Is it morning? Please answer yes or no read timeofday if [ $timeofday = yes ]; then echo Good morning else echo Good afternoon fi exit 0 Page 24 user input
elif 조건문실습 실습 9. elif 를사용하여더많은검사를수행하기 [ue20@zeus ch2]$ vim ch2_ex_if.sh #!/bin/sh echo Is it morning? Please answer yes or no read timeofday if [ $timeofday = yes ];then echo Good morning elif [ $timeofday= no ];then echo Good afternoon else echo Sorry, $timeofday not recognized. Enter yes or no exit 1 fi Page 25
Shell 제어구조 For 값의범위에대한반복문수행 값의범위는문자열의집합도가능 For 구문 for variable in values do statements done Page 26
for 반복분실습 실습 10. 고정된문자열을사용하는 for 반복문 [ue20@zeus ch2]$ vim ch2_for.sh #!/bin/sh for foo in bar fud 43 do echo $foo done exit 0 [ue20@zeus ch2]$ vim ch2_for1.sh #!/bin/sh for foo in bar fud 43 do echo $foo done exit 0 변수 foo 를만들고 for 반복문이매번실행할때마다다른같값이대입된다. 따라서위의두예제결과같다름을알수있을것이다. Page 27
for 반복분실습 실습 11. 와일드카드 (*) 확장을사용하는 for 반복문 [ue20@zeus ch2]$ vim ch2_wfor.sh for file in $(ls c*.sh) do echo $file done exit 0 values 같값으로 $(command) 을이용하여, 변수명 ( 여기서는 file) 은 $(ls c*.sh) 에포함된명령의출력같값을이용한다. 즉, 현재디렉토리내의 c 로시작하고확장자같 sh 로끝나는 (c*.sh) 모든파일을입력으로해서 echo $file 출력을한다. Page 28
The previous script is buggy! ( 파일이름에공백이있는경우 ) 대신아래문장사용 : for file in c*.sh Python: import glob for fname in glob.glob( c*.sh ): Page 29
Shell 제어구조 For 문 모든 shell 변수가기본적으로문자열로인식하기때문에, for 반복문은문자열집합에대해반복문을수행하기에편리 하지만, 정해진횟수만큼명령을실행할수없음 ( 또는외부명령 seq 등이필요 ) #!/bin/sh for foo in 1 2 3 4 5 6 7 8 9 10 11 12 do echo here we go again done exit 0 while 구문 while condition do statements done Page 30
while 문실습 실습 12. while 문을이용한간단한 password 확인프로그램작성 [ue20@zeus ch2]$ vim ch2_pass_while.sh #!/bin/sh echo Enter password read pass while [ $pass!=kokoro ]; do echo Sorry, try again.. read pass done exit -0 user input Page 31
while 문실습 실습 13. 정해진횟수만큼실행해보기 [ue20@zeus ch2]$ vim ch2_count_while.sh #!/bin/sh foo=1 while [ $foo le 5 ] do echo Here we go again foo=$(($foo+1)) done exit 0 [ Expression1 le Expression2 ] exp1 Page 32 이 exp2 보다작거나같같을때까지반복한다
Shell 제어구조 until 구문 until condition do statements done Page 33
Shell 제어구조 [ue20@zeus ch2]$ vim until2.sh #!/bin/sh until who grep $1 > /dev/null do sleep 10 done echo e \\a echo $1 has just logged in exit 0 현재로그인된 user 검색명령어 첫번째파라미터 Page 34
Python version #!/usr/bin/python import subprocess as sp import time while sp.call('who grep "'+sys.argv[1]+'"', shell=true)==1: time.sleep(10) print(sys.argv[1]+" has just logged in") Page 35
Shell 제어구조 Case 구문 case variable in Page 36 esac pattern [ pattern ]...) statements;; pattern [ pattern ]...) statements;;... #!/bin/sh echo Is it morning? Please answer yes or no read timeofday case $timeofday in yes y Yes YES ) echo Good Morning ;; [nn]* ) echo Good Afternoon ;; * ) echo Sorry exit 1;; esac [ue20@zeus ch2]$
Quiz 다음작업을하는 shell program 을작성한다. 1. Creating 1000 files $./create1000files.sh - ~/test/ 디렉토리에 1.txt, 2.txt,, 1000.txt 파일을생성함. 빈파일이생성됨. 참고 : $ touch 1.c //1.c 파일이생성됨. 2. 임의의실행파일이설치되어있는폴더를 echo 하는프로그램예 : $./find.sh bash /bin/ 참고 : whereis bash 명령과 cut 명령, echo 명령, backtick 등을사용하여구현가능 ( 파이프를사용해서한줄로도가능 ) 3. CPU 의코어개수를 echo 하는한줄 bash 스크립트 (/proc/cpuinfo 텍스트파일참고 ) Page 37
Reference KLDP Shell Programming 의기본 http://wiki.kldp.org/wiki.php/docbooksgml/shell_programming-trans 초보자용 Shell Programming http://www.softintegration.com/docs/ch/shell/ Page 38