Download presentation
Presentation is loading. Please wait.
Published byAmy West Modified over 8 years ago
1
Computer Programming Batch & Shell Programming 9 th Lecture 김현철 컴퓨터공학부 서울대학교 2009 년 가을학기
2
Slide Credits 엄현상 교수님 서울대학교 컴퓨터공학부 Computer Programming, 2007 봄학기
3
순서 Bash Shell Programming Quoting 보충 Looping Per-Case Execution Array Example Miscellaneous Q&A
4
Bourne Shell Scripts #!/bin/sh # Generate some info date echo $HOME echo $USER echo $PATH cal 2007. 04. 03. ( 화 ) 11:52:37 KST /csehome/net001 net001 /usr/local/bin:/usr/bin:/bin … (omitted) Result
5
Variables and Backquotes cname="Computer Programming Class" gsnum=70 echo $cname: “#” of good students = $gsnum Computer Programming Class: # of good students = 70 … (same as above) bsnum=10 stnum=$gsnum+$bsnum echo $cname: total "#" of students = $stnum Computer Programming Class: total # of students = 70+10 … (same as above except for the last two lines) stnum=`expr $gsnum`+ $bsnum` echo $cname: total "#" of students = $stnum Computer Programming Class: total # of students = 80 Stored as a String
6
Quoting : Rules 1) Single Quotes (') 따옴표로 둘러 쌓여 기술된 모든 특수문자들은 쉘로부터의 번역이 모두 금지된다. 따옴표는 특수문자의 기능을 필요에 의해 제한하기 위해서 사용한다. 2) Double Quotes (“) 쌍 따옴표는 따옴표와 동일한 기능을 수행한다. 단, $, `, \ 의 3 가지 특수문자는 영향을 받지않고 정상대로 쉘에의해 번역된다. 3) Backquotes (`) 역 따옴표에 기술되어 있는 문자열을 쉘에게 실행 명령어라는 것을 알려주기 위해 사용한다. 쉘은 이 명령어를 실행한후 생성된 출력을 명령어가 지정된 위치에 위치시킨다. ( 주의 ) 이상 3 가지의 보호문자는 반드시 쌍으로 이루어 진다. 만일 쌍으로 지정되지 않은 경우에는 문법 에러를 발생한다. 4) Backslash (\) 역 슬래쉬는 연이어 기술된 다음 한자가 갖고 있는 특수문자의 처리를 쉘이 수행하지 못하도록 처리한다.
7
Quoting Examples of Quoting Rules person=hatter ExpressionValue $personhatter "$person" [or] ""$person"" [or] ''$person ''hatter \$person$person '$person'$person "'$person'" [or] \'$person\''hatter' \"$person\" [or] "\"$person\"" [or] \""$person"\""hatter" \''$person'\''$person' '"$person"'"$person"
8
Command-Line Arguments echo '1st command-line argument = $1' echo "2nd command-line argument = $2" echo 3rd argument = $3 echo "# of arguments = $#" echo Entire list of arguments = $* martini:~$ arg.sh 1 2 3 1st command-line argument = $1 2nd command-line argument = 2 3rd argument = 3 # of arguments = 3 Entire list of arguments = 1 2 3 Result
9
테스트 연산자 옵션의미기능 () 연산의 순서를 제어, 그룹핑 ! 부정 (NOT) 논리 연산자 -a 논리곱 (AND) -o 논리합 (OR) -z string string 의 길이가 "0" 이면 참 문자열 연산 -n string string 의 길이가 "0" 아니면 참 string1 = string2 string1 과 string2 가 같으면 참 string1 !=string2 string1 과 string2 가 같지 않으면 참 n1 -eq n2 두수가 같으면 참 숫자 연산자 n1 -ne n2 두수가 같지 않으면 참 n1 -gt n2 n1 이 크면 참 n1 -ge n2 n1 이 크거나 같으면 참 n1 -lt n2 n1 이 작으면 참 n1 -le n2 n1 이 작거나 같으면 참 -r file file 이 존재하고 읽을 수 있으면 참 파일 연산자 -w file file 이 존재하고 기록 가능하면 참 -x file file 이 존재하고 실행 가능하면 참 -f file file 이 존재하고 정규 파일이면 참 -d file file 이 존재하고 디렉토리이면 참 -s file file 이 존재하고 비어있지 않으면 참
10
Conditional Execution if [ $1 –lt $2 ]; then echo $1 is less than $2 elif [ $1 –gt $2 ]; then echo $1 is greater than $2 else echo $1 equals to $2 fi martini:~$ cond.sh 1 2 1 is less than 2 martini:~$ cond.sh 2 1 2 is greater than 1 martini:~$ cond.sh 1 1 1 equals to 1 Result Space
11
Bourne Shell Script Example if [ -z $1 ] || [ -z $2 ]; then echo usage: $0 source_dir target_dir else SRC_DIR=$1 DST_DIR=$2 OF=output.`date +%y%m%d`.tar.gz if [ -d $DST_DIR ]; then tar -cvzf $DST_DIR/$OF $SRC_DIR else mkdir $DST_DIR tar -cvzf $DST_DIR/$OF $SRC_DIR fi martini:~$backup.sh srcdir dstdir Execution
12
Quoting 보충 Examples of Quoting Rules person=hatter ExpressionValue $personhatter "$person" [or] ""$person"" [or] ''$person ''hatter \$person$person '$person'$person "'$person'" [or] \'$person\''hatter' \"$person\" [or] "\"$person\"" [or] \""$person"\""hatter" \''$person'\''$person' '"$person"'"$person"
13
Shell 특수변수 ┌──── ┰ ─────────────────────────────┐ │ 변수 ┃ 목적 │ ├──── ╂ ─────────────────────────────┤ │ $0 ┃명령어 라인상의 명령어 이름이 설정 │ ├──── ╂ ─────────────────────────────┤ │ $# ┃명령어 라인상에 기술되어 있는 인자의 갯수가 설정 │ ├──── ╂ ─────────────────────────────┤ │ $* ┃명령어 라인내의 전체 인자가 설정 │ ├──── ╂ ─────────────────────────────┤ │ "$@" ┃ $* 와 같다. 그러나따옴표로 둘러쌓인 인자를 하나의 인자로 │ │ ┃처리하는 것이 $* 와 틀린 점이다. │ ├──── ╂ ─────────────────────────────┤ │ $$ ┃현재의 프로세스 식별자 (PID) 가 설정 │ ├──── ╂ ─────────────────────────────┤ │ $! ┃ Background 에서 직전에 실행됐던 프로세스의 식별자가 설정 │ ├──── ╂ ─────────────────────────────┤ │ $? ┃직전에 Foreground 에서 실행됐던 명령어의 종료상태가설정 │ ├──── ╂ ─────────────────────────────┤ │ $- ┃현재 설정된 쉘 옵션이 설정 │
14
Looping for arg in "$@"; do # correct echo $arg done for arg in "$*"; do # wrong echo $arg done martini:~$ loop.sh 1 "2 2" 3 1 2 3 1 2 2 3 Result Double Quotes around $@
15
Looping ( 계속 ) martini:~$ ls backup.C backup.c backup1.C backup1.c Results martini:~$ for.sh a backup.C backup.c martini:~$ for.sh c backup.C backup.c martini:~$ more for.sh for cfilename in *$1*u?.[cC]; do echo $cfilename done
16
Looping ( 계속 ) i=0 while [ $i –lt 3 ]; do echo $i i=`expr $i + 1` done ` Result let i=i+1 # bash only martini:~$ while.sh 0 1 2
17
Per-Case Execution echo Enter your command \ (who, list, or quit \ ) while read command; do case $command in who) who; echo Done with running who;; list) ls; echo Done with running ls;; quit) break;; *) echo Enter who, list, or quit;; esac done Result martini:~$ case.sh Enter your command (who, list, or quit) who net001 pts/2 Mar 31 13:26 … (omitted) Done with running who list … Done with running ls date Enter who, list, or quit quit martini:~$
18
Array (bash Only) Variable Containing Multiple Values No Maximum Limit to the Size No Requirements That Member Variables Be Indexed or Assigned Contiguously Zero-Based
19
Array ( 계속 ) a1=(one two three) echo ${a1[*]} echo a1[*] echo ${a1[@]} echo a1[@] echo ${a1[0]} echo a1[0] echo ${a1[3]} unset a1[3] unset a1[*] echo ${a1[0]} Result one two three a1[*] one two three a1[@] one a1[0] # unset i=0 echo $i unset i echo $i ------- 0
20
Bash Script Example ( 계속 ) i=0 status=0 if [ $# -lt 1 ]; then echo Usage: $0 [-b base1 base2...] [-c expo1 expo2...] exit 1 fi for arg in "$@"; do if [ -n "`echo $arg | grep '-'`" ]; then if [ $arg = -b ]; then status=1 elif [ $arg = -c ]; then status=2 fi else case $status in 1 ) base[$i]=$arg; i=`expr $i + 1` ;; 2 ) exponent[$i]=$arg; i=`expr $i + 1` ;; * ) echo Usage: $0 [-b base1 base2...] [-c expo1 expo2...]; exit 1 ;; esac fi done # to be continued on the next slide
21
Bash Script Example ( 계속 ) if ! [ -d OUTPUT ]; then mkdir OUTPUT if [ $? -gt 0 ]; then # if the exit status of the previous command indicates a failure echo Remove/Rename the OUTPUT File exit 1 fi for i in ${base[@]}; do for j in ${exponent[@]}; do if ! [ -e./OUTPUT/output.$i.$j ]; then./pow $i $j >>./OUTPUT/output.$i.$j fi done martini:~$powsim.sh –b 3 4 5 –c 12 14 16 Execution
22
Shell Programming 보충 Bash Variable Naming letter -> A | B | … | Z | a | b | … | z digit -> 0 | 1 | … | 9 u_s -> _ var_name -> (letter | u_s)(letter | digit | u_s) * a=1 echo $aa martini:~$ var_naming.sh Result To show the value 1, this ‘a’ should be ~, !, @, #, %, ^, *, -, +, =, {, [, }, ], :, \,,., ?, /, or [space]
23
Shell Programming 보충 ( 계속 ) Character Echoing Shown as Expected If There Is Space Before and After the Character (Refer to Handout 7) Possibly Shown Verbatim If There Is an Adjacent Character martini:~$ echo ~# ~# Some Exceptions a=1 echo $aa --- To show the value 1, the latter ‘a’ should be ~, !, @, #, %, ^, *, -, +, =, {, [, }, ], :, \,,., ?, /, or [space] ~echo ~; echo ~/ echo ~+ echo ~: echo ~ \ /home/net001 /home/net001/ /home/net001/Program (Current Directory) /home/net001: Continue on next line / Next character quote #echo /*., #~@/*., (part starting with # not shown because of the preceding space) *echo *~aaa~ (Wildcard if there is a match, aaa~) e.g., ~~
24
Miscellaneous Stream Editor: sed Global Search and Replace Character Translator: tr Regular Expressions for Editors (Including sed) and grep Option Interpretation: getopts Functions Signals …
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.