shell programming concept of the shell environment of shell shell as programming language

44
Shell Programming Concept of the Shell Environment of Shell Shell as programming language

Upload: oswald-hodges

Post on 17-Jan-2016

297 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

Shell Programming

Concept of the ShellEnvironment of ShellShell as programming language

Page 2: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 2/42

What is Shell?

Shell 이란 ? 명령어 해석기 시스템과 사용자간의 대화창구 == Shell 인터페이스

Login 시 명령어 해석 및 실행 기능 Kernel 및 응용프로그램과의 인터페이스 프로그래밍 언어로서의 Shell

Shell 의종류 Bourne Shell Bourne Again Shell (bash) ($) csh 확장 csh (tcsh) (%) Korn Shell, V Shell…. 기본기능이나 작동법은 동일

Page 3: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 3/42

Functionalities of Shell

Login 시 명령어 해석 및 실행 기능 Kernel 및 응용프로그램과의 인터페이스 프로그래밍 언어로서의 Shell

Page 4: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 4/42

What is Shell?

Shell 의 기능 내부명령 , 외부명령 실행 명령프롬프트 (whereis !) 여러명령 연결 – 파이프 (|) 입 / 출력 리다이렉션 ( >,<,>>,<<,2> ) : 명령방향 전환 특수문자 해석 및 치환 , 명령어 치환 지역 / 환경변수 관리 스크립트 프로그래밍 언어 자동화 작업 (batch

processing)

Page 5: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 5/42

Shell Environments

Shell 프롬프트 # echo SHELL

echo 는 뒤에 나오는 문자열 출력 # echo $SHELL

‘$’ 는 뒷단어를 변수로 인식하고 변수내용 출력

Meta Characters Shell 이 해석하는 특수한 기능을 가진 문자 $ 메타문자 해석 금지 \ , “”, ‘’

예 ) #echo \$SHELL

Page 6: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 6/42

Shell Environments

Linux 의 기본 Shell: GNU Bourne Again Shell (/bin/bash) C 문법을 많이 이용

bash 의 환경설정 파일 사용자별 환경설정 파일 (cd ; ls –aF)

• .bash_logout, .bash_profile, .bashrc

• 원본파일 /etc/skel/ 디렉토리에 존재 • 새로운 사용자 추가시마다 각 사용자의 홈디렉토리에 복사됨 .

• “.” 으로 시작하는 파일은 hidden file

모든사용자 공통의 환경설정 파일• /etc/profile , /etc/bashrc

환경설정 파일 인식 순서 /etc/profile ~/.bash_profile ~/.bashrc /etc/bashrc

Page 7: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 7/42

Path

현재 path 관련 변수 확인 % echo $PATH

path 디렉토리 추가 전체 사용자에게 추가 : /etc/profile 편집 특정 사용자에게 추가 : ~/.bash_profile 편집 현재 로그에서만 추가 ( 로그아웃시 소멸 )

• % echo $PATH• % PATH=$PATH:< 추가할 디렉토리 >

개인별 별칭 (alias) 설정 단축명령어 등록

~/.bashrc 편집 및 활성화 ( . .bashrc) 예 ) alias lsa=‘ls –a‘

사용자 프롬프트 변경 절대경로 표시 : /etc/bashrc 편집

• PS1=“[\u@\h \W] \\$ PS1=“[\u@\h \$PWD] \\$

Page 8: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 8/42

Logout and Commands History

로그아웃시의 실행 ~/.bash_logout 편집

도스키 및 자동 완성 도스키

• 기존사용 명령어 다시불러오기• 화살표 사용

자동완성• 일부 앞글자만 입력후 [TAB] 키 사용• 디렉토리 이동시 편리함

Page 9: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 9/42

Pipe & Redirection

ps | sort |more ls –l > out.txt Ps >> out.txt

표준에러 출력 redirection, 2> 와 동일 Kill –9 1234 > out.txt 2>&1

Kill –9 1234 > o ut.txt 2>error.txt

Page 10: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 10/42

Shell as programming Language

sh <enter>Cd /etc

$ for i in * : 현재 디렉토리의 모든 파일> do : for 의 do> grep Linux $i

> done : do 의 닫음결과$

Page 11: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 11/42

Making Shell Script

위 예제#!/bin/sh

# exam1.sh# 예제 1

for i in * do if grep -l Linux $i then more $i fi doneexit 0

Page 12: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 12/42

Running Shell Script

/bin/sh exam1.shchmod +x exam1.sh./exam1.sh <return>

Page 13: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 13/42

Shell Programming

사용 명령어 Shell 내장명령어 + Linux 명령어

프로그래밍 언어로서 일반적인 형식 변수 , 제어문 , 리스트 , 함수 , 내장명령어

Page 14: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 14/42

Variables

선언 별도 선언 없음 ( 최초에는 변수명만 표기 ) 일반적으로 character string 변수임

변수의 호출 $ 변수명 Ex: foo=‘today’

echo $foo

#!/bin/sh

foo="Hello World"

echo $foo

#unset foo

foo=

echo $foo

Page 15: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 15/42

Variables

$ 변수명 , “$ 변수명” ‘$ 변수명’ 변수 사용예

답Hi there

Hi there

Hi there

$myvar

$myvar

Enter some text

Hello World

$myvar now equals Hello World

#!/bin/sh

myvar="Hi there"

echo $myvar

echo ${myvar}

echo "$myvar"

echo '$myvar'

echo \$myvar

echo Enter some text

read myvar

echo '$myvar' now equals $myvar

exit 0

Page 16: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 16/42

Environment

$HOME : 사용자의 홈 디렉토리 $PATH : 디렉토리 목록 $PS1, $PS2 : 프롬프트 $0 : Shell 스크립트 /명령어 이름 $# : 전달된 파라메터 수 $$ : Shell 스크립트 프로세스 번호 echo 명령어로 실행

Page 17: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 17/42

Parameter Variables

$1, $2, … : 스크립트에 주어진 파라메터

$* : 모든 파라메터

#!/bin/sh

sal="Hello"

echo $sal

echo "The program is $0"

echo “2: $2"

echo "1: $1"

echo "The parameter list: $*"

echo "The Home Dir: $HOME"

echo "Please enter a new greeting"

read sal

echo $sal

echo "complete…"

Page 18: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 18/42

Conditional Statement: if

구조 test 문

test –f fred.c [ -f fred.c ]

if condition

then

statement

else

statement

fi

Page 19: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 19/42

If Statements: Examples

#!/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 20: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 20/42

Test statement

-b file : file is a block special file-c file : file is a character special file-d file : file exists and is a directory-f file : file exists and is a file-g file : file has the set-group-id bit set-k file : file has the sticky bit set-p file : file is a named pipe-r file : file is readable-s file : file is greater than 0 byte-t n : n is a file descriptor, 0=keyboard input-u file : file has the set-user-id-w file : file is writable-x file : file is executable

Page 21: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 21/42

Test Statements

스트링 비교 string1 = string2 string1 != string2 -n string : null 아니면 참 -z string : null 이면 참

산술비교 exp1 –eq exp2 exp1 –ne exp2 exp1 –gt exp2 ef: -ge, -lt –le ! expression

Page 22: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 22/42

Iteration : for

형식

for variable in values

do

statement

done

#!/bin/sh

for foo in bar fud 43

do

echo $foo

done

exit 0

Page 23: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 23/42

for : Examples

#!/bin/sh

for foo in bar fud 43

do

echo $foo

done

exit 0

---- 결과

bar

fud

43

Page 24: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 24/42

Iteration: while

형식

while condition; do

statement

done

#!/bin/sh

echo "Enter Password"

read trythis

while [ "$trythis" != "secret" ]; do

echo "Sorry, try again"

read trythis

done

exit 0

Page 25: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 25/42

Iteration: until

형식

until condition

do

statement

done

#!/bin/sh

until who | grep "$1" > /dev/null

do

sleep 60

done

# Now ring the bell and announce the unexpected user.

echo -e \\a

echo "***** $1 has just logged in *****"

exit 0

Page 26: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 26/42

Selection Statement: Case

형식

case variable in

pattern [ | pattern] ... ) statement;;

pattern [ | pattern] ... ) statement;;

...

esac

Page 27: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 27/42

Case: Examples

#!/bin/sh

echo "Is it morning? Please answer yes or no"

read timeofday

case $timeofday in

"yes") echo "Good Morning";;

"no" ) echo "Good Afternoon";;

"y" ) echo "Good Morning";;

"n" ) echo "Good Afternoon";;

* ) echo "Sorry, answer not recognised";;

esac

exit 0

Page 28: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 28/42

Case: Examples

#!/bin/sh

echo "Is it morning? Please answer yes or no"

read timeofday

case $timeofday in

"yes" | "y" | "Yes" | "YES" ) echo "Good Morning";;

"n*" | "N*" ) echo "Good Afternoon";;

* ) echo "Sorry, answer not recognised";;

esac

exit 0

Page 29: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 29/42

Listing Commands: AND &&

다수 명령어 결합 , 앞명령어 성공시 뒷명령어 수행

형식 : statement1 && statement2 … #!/bin/sh

touch file_one

rm -f file_two

if [ -f file_two ] && echo "hello" || echo "there"

then; echo "in if"

Else; echo "in else"

fi

exit 0

Page 30: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 30/42

Listing Commands: OR ||

하나의 명령이 성공할 때까지 수행 , 나머지 수행안함

형식 : statement1 || statement2 || …

#!/bin/sh

rm -f file_one

if [ -f file_one ] || echo "hello" || echo "there"

then; echo "in if"

else; echo "in else"

fi

exit 0

Page 31: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 31/42

Statement Block

AND, OR 리스트를 함수 형태로 형식

function_name ( ) {

statement

...

}

Page 32: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 32/42

Statement Block: Examples

#!/bin/sh

yes_or_no() {

echo "Parameters are $*"

while true

do

echo -n "Enter yes or no“ ; read x

case "$x" in

“ y” | ”yes” ) return 0;;

“n” | “no” ) return 1;;

* ) echo "Answer yes or no"

esac

done

}#yes_or_no()

echo "Original parameters are $*"

if yes_or_no "Is your name $1"

then

echo "Hi $1"

else

echo "Never mind"

fi

exit 0

Page 33: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 33/42

Internal and External Commands

명령어 일반적인 Linux 명령어 ( 외부명령어 ) Shell 내부 명령어

break Shell 스트립트 수행시 종료

: Null 명령어 , true 로 실행 결과

Page 34: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 34/42

Internal and External Commands

• (dot) 명령어 명령어 수행 : >. ./shell_script

echo String 프린트 = C 언어에서 printf 와 유사

eval

foo=10 답 : $foo

x=foo

y='$'$x

echo $y

foo=10 답 : 10

x=foo

eval y='$'$x

echo $y

Page 35: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 35/42

Internal and External Commands

exec Shell 스크립트 내에서 명령어 수행 스트립트의 다음 행부터 수행 안함

#!/bin/sh

echo "first"

exec wall "Hi there this is test"

echo "second"

exit 0

Page 36: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 36/42

Internal and External Commands

Exit n Shell 스크립트 수행 종료 n=0 : 성공적인 종료 1<n<125 : 사용 가능 n=126 : 파일이 실행 불가능 n=127 : 명령이 발견되지 못함 n<128 : 시그널 발생

Page 37: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 37/42

Internal and External Commands

export 지정된 변수를 서브 Shell 에서 유효하게

# Shell Program export1.sh

#!/bin/sh

foo="The first meta-syntactic variable"

export bar="The second meta-syntactic variable"

export2 #!/bin/sh

# Shell Program export2.sh

echo "$foo"

echo "$bar"

Page 38: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 38/42

Internal and External Commands

expr 인수를 수식으로 평가expr 327 + 431

758

set : Shell 을 위한 파라메터 변수 설정#!/bin/sh

echo The date today date is $(date)

set $(date)

echo The month is $2

exit 0

Page 39: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 39/42

Internal and External Commands

shift 파라메타 변수 값을 한단계 왼쪽으로 $2 는 $1 으로 단 , $0 는 변경 불가 사용 : shift

trap Signal 이 수신될 때 수행 반복문 수행시 signal 수신하면 위의 trap 문 수행 형식 : trap command signal

Page 40: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 40/42

Trap 문 예제

#!/bin/sh

trap 'rm -f /tmp/my_tmp_file_$$' INT

echo creating file /tmp/my_tmp_file_$$

date > /tmp/my_tmp_file_$$

echo "Press interrupt (Ctrl-C) to interrupt...."

while [ -f /tmp/my_tmp_file_$$ ]; do

echo File exists

sleep 1

done

echo The file no longer exists

trap -INT

echo creating file /tmp/my_tmp_file_$$

date > /tmp/my_tmp_file_$$

echo "Press interrupt (Ctrl-C) to interrupt...."

while [ -f /tmp/my_tmp_file_$$ ]; do

echo File exists

sleep 1

done

echo We never get here

exit 0

Page 41: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 41/42

Debugging

특별한 디버깅 도구 없음 에러 있는 행의 번호를 출력 그외 방법 : 명령라인 옵션

스크립트 내 set 옵션

sh -n <script> : 형식 검사만 , 실행안함

sh -v <script> : 실행전 스크립트 출력

sh -x <script> : 처리후 명령라인 출력

set -o noexec or set -n

set -o verbose or set -v

set -o xtrace or set -x

set -o nounset or set -u

Page 42: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 42/42

Commands in Shell Scripts

cut 파일의 특정 필트 추출 -d 에 delimeter 정의 가능 예제 : grep root /etc/passwd | cut –f1,5 –d: ls –l | cut –c1-15,55-

paste 예제 : ls –a | paste - - ; - 출력 라인 2 개씩

Page 43: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 43/42

Commands in Shell Scripts

sort 하나 혹은 둘 이상 파일의 내용의 순서화 예제 : sort –t: +0 –2 /etc/passwd delimeter :, 1 번째부터 2 번째 필드로

그외 join, merge, uniq

Page 44: Shell Programming Concept of the Shell Environment of Shell Shell as programming language

RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line

Linux Programming, Spring 2009 44/42

Commands in Shell Scripts

tr 변환 예 : tr “[ ]” “[\012]” < chapter1 | sort| uniq –c

\012 : form feed, new line