2. 쉘프로그래밍 상명대학교소프트웨어학부
쉘 (Shell) 쉘 : 명령어해석기 단말기나파일로부터입력된명령을해석하여적절한명령을실행 시스템환경변경, 명령어입력편의를제공 쉘의종류 Bourne Shell(sh) /bin/sh Korn Shell(ksh) /bin/ksh C Shell(csh) /bin/csh Bourne Again Shell(bash) /bin/bash /etc/passwd 파일에서로그인직후사용되는쉘을확인 유닉스프로그래밍 - 상명대학교 2
쉘 (Shell) 명령어해석및실행 사용자가명령입력 해석 / 실행 내부명령 : 직접해당기능을수행 외부명령 : 해당프로그램을실행 ( 뒤따르는단어들은옵션으로넘겨줌 ) echo [ 문자열 ] $ echo date ( 또는 date, 또는 date ) date $ echo Today is `date` Today is 2003년 10월 11일 유닉스프로그래밍 - 상명대학교 3
쉘 (Shell) 쉘변수 사용자정의쉘변수 키워드쉘변수 $HOME : 홈디렉토리의절대경로명 $PATH : 명령을탐색할경로 $PS1 : 프롬프트형태 지역변수와전역변수 지역변수 : 현재쉘에서만유효 전역변수 : 자식쉘에서도유효 export [ 변수명 ] 유닉스프로그래밍 - 상명대학교 4
쉘 (Shell) 초기화 / 종료파일 : 쉘변수와실행시킬명령을저장.bash_profile,.bashrc.bash_logout 별칭 alias [ 별칭 = 명령 ] unalias 별칭 히스토리 ( 명령재실행 ).bash_history 파일에지난명령들이저장 확인 : history 명령 사용 : 키,!!,! 번호,! 패턴 유닉스프로그래밍 - 상명대학교 5
쉘프로그램 쉘프로그램 쉘이제공하는프로그래밍언어를이용하여만들어진프로그램 ( 파일 ) 쉘프로그램예 : 현재시스템에접속한사용자수 쉘프로그램사용 x who wc l [enter] 쉘프로그램사용 <how_many.sh> date echo 현재시스템에접속한사용자는 `who wc -l` 명입니다 유닉스프로그래밍 - 상명대학교 6
쉘프로그램 작성 일반텍스트파일로작성 첫줄에는실행할쉘이름을적어줌 : #!/bin/bash 실행 ( 예 : script.sh) chmod +x script.sh $ script.sh $ bash script.sh 유닉스프로그래밍 - 상명대학교 7
쉘프로그램 실행가능한파일만들기 : chmod 명령어 작성한쉘스크립트파일을실행가능한파일로만듬 chmod 명령어를사용하여해당파일의속성을변환 예 ) script.sh 의권한 $ chmod u+x script.sh $ chmod g+wx script.sh $ chmod a=rwx script.sh 문자 u g o a 문자 r w x - 연산자 + - = 그룹 누가영향을받는가? 사용자 / 자신 그밖의사용자 모든사용자 : ugo 조합대신에사용할수있다 허가권한범주 읽기허가권한 쓰기허가권한 실행허가권한 허가권한없음 허가권한범주에취해진특정행위 허가권한승인 허가권한거부 특정사용자에관한모든허가지정 유닉스프로그래밍 - 상명대학교 8
쉘프로그래밍의특징 간단한프로그램작성법을따른다 사용자사용권한을위한강력한도구이다 사용자파일에임의의명령어나일련의명령어를추가할수있다 실행파일의생성이가능하다 $ 프롬프트에실행파일의입력을통해간단하게실행할수있다 유닉스프로그래밍 - 상명대학교 9
쉘프로그래밍 - 변수 유닉스쉘도다른프로그래밍언어와마찬가지로변수를생성하여값을저장 변수에값을저장하기위해서간단한변수명생성후등호표시 (=) 를이용하여변수에값을저장 Ex) $ varible=3 $ echo $variable $ 3 유닉스쉘프로그래밍언어는정수형, 문자형, 부동소수점과같은자료형을지원하지않음 유닉스프로그래밍 - 상명대학교 10
쉘프로그래밍 - 변수 unset 명령어를사용하여변수를지우거나쉘스크립트가종료될때까지메모리에보존 ex) $ unset variable [Enter] 변수의출력 Echo 명령어를사용하여변수의내용을출력 ex) $ echo $variable 명령어치환 역인용부호 (``) 안에명령어를삽입하고명령어를실행할경우, 변수의출력에명령어의실행결과를치환 Ex)$ DATE=`date` [Enter] $ echo $DATE [Enter] 유닉스프로그래밍 - 상명대학교 11
쉘프로그래밍 - 변수 쉘스크립트는특수한변수 ( 위치변수또는매개변수 ) 에있는명령라인으로부터 10 개의명령라인매개변수 ( 인자 ) 를읽을수있음 명령라인인자는보통명령어를공백으로구분하여입력 입력된인자는프로그램에서처리되며, 프로그램의동작이나특별한명령에서실행할수있도록변경 유닉스프로그래밍 - 상명대학교 12
쉘프로그래밍 - 변수 변수 $0 $1, $2, $9 $# $@ $? $* $$ 의미명령라인에입력된스크립트의이름을포함첫번째부터아홉번째까지각각의명령라인파라미터를포함명령라인파라미터의개수를포함모든명령라인파라미터를포함마지막명령어의결과에대한상태값을포함모든명령라인파라미터를포함수행중인프로세스의 PID를포함 유닉스프로그래밍 - 상명대학교 13
쉘프로그래밍 - 변수 변수사용예입력 <variable-1.sh> echo "The following is output of the $0 script:" echo "Total number of command line arguments: $#" echo "The first parameter is: $1 " echo "The second parameter is: $2 " echo "This is the list of all is parameters: $* " $ bash variable-1.sh $ bash variable-1.sh is empty 유닉스프로그래밍 - 상명대학교 14
쉘프로그래밍 - 변수 변수사용예입력 <variable-2.sh> date set `date` echo $1 set `date` echo $1 $2 set `date` echo $1 $2 $3 set `date` echo $1 $2 $3 $4 유닉스프로그래밍 - 상명대학교 15
쉘프로그래밍 조건과테스트 쉘스크립트를작성하는데필요한제어를통해다른명령어의결과에따라명령어가수행하도록작성 if-then 구조 if 문장은조건이참인지, 거짓인지를확인하는메커니즘을제공 if 문장의수행결과에따라프로그램에서명령어수행의순서를변경 if [condition] then commands. last command fi 유닉스프로그래밍 - 상명대학교 16
쉘프로그래밍 조건과테스트 if-then 구조사용예 <if_then.sh> DIR=$HOME/unix if [ $# = 1 ] then cp $1 $DIR fi exit 유닉스프로그래밍 - 상명대학교 17
쉘프로그래밍 조건과테스트 if-then-else 구조 if 구조에 else 절을추가함으로써, 거짓상태를반환하는경우수행하는명령어들을정확히입력할수있도록해줌 if [condition] then true-commands last-true-command else false-commands. last-false-command fi 유닉스프로그래밍 - 상명대학교 18
쉘프로그래밍 조건과테스트 if-then-else 구조사용예 <if_then_else.sh> DIR=$HOME/unix if [ $# = 1 ] then cp $1 $DIR Else echo You must specify a file name. Try again. fi exit 유닉스프로그래밍 - 상명대학교 19
쉘프로그래밍 조건과테스트 if-the-elif 구조 스크립트파일에 if 와 else 구조를연속해서여러번사용하는경우, elif 문장을사용 if [condition] then command-1 elif [condition_2] then command-2 else command -3 fi 유닉스프로그래밍 - 상명대학교 20
쉘프로그래밍 조건과테스트 참또는거짓 : test 명령어 test 는표현식이참또는거짓을경우해당하는값을반환하는쉘명령에내장된명령어 <test.sh> echo "Are you OK?" echo -e "Input Y for yes and N for no : \c" read answer if test "$answer" = Y then echo "Glad to hear that" else echo "Go home!" fi exit 유닉스프로그래밍 - 상명대학교 21
쉘프로그래밍 조건과테스트 서로다른범주시험하기 test 명령을시험하기위해서두개의정수를사용 논리연산자로두수를비교하는표현을조립 ex) $ test expression_1 logical operator expression_2 논리연산자 and 논리연산자 (-a) : 양쪽상태가참일경우 0을반환 or 논리연산자 (-o) : 양쪽중하나의상태가참일경우 0을반환 not 논리연산자 (!) : 상태가거짓을경우 0을반환 유닉스프로그래밍 - 상명대학교 22
쉘프로그래밍 조건과테스트 연산자 예제 의미 -eq -ne -gt -ge -lt -le number1 eq number2 number1 ne number2 number1 gt number2 number1 ge number2 number1 lt number2 number1 le number2 number1은 number2와같은가? number1은 number2와같지않은가? number1은 number2보다큰가? number1은 number2와크거나같지않은가? number1은 number2와작은가? number1은 number2와작거나같지않은가? 유닉스프로그래밍 - 상명대학교 23
쉘프로그래밍 조건과테스트 test 사용예 <condition_test.sh> echo -e "Enter three numbers and I will show you the largest of them >> \c" read num1 num2 num3 if test "$num1" -gt "$num2" -a "$num1" -gt "$num3" then echo "The largest number is : $num1" elif test "$num2" -gt "$num1" -a "$num2" -gt "$num3" then echo "The largest number is : $num2" else echo "The largest number is : $num3" fi echo "Done~! :-)" exit 유닉스프로그래밍 - 상명대학교 24
쉘프로그래밍 조건과테스트 문자값비교 test 명령은문자를비교하는데다른연산자를제공 연산자 =!= -n -z 예제 string1 = string2 string1!= string2 -n string -z string2 의미 String1과 string2는일치하는가? String1과 string2는일치하지않는가? String 문자 ( 길이 0) 를포함하는가? String1은빈문자 ( 길이 0) 인가? 유닉스프로그래밍 - 상명대학교 25
산술 & 관계연산 산술연산 $ expr 1+2 [Enter] 3 $ expr 10\% 3 [Enter] 1 관계연산자 $ expr Gabe = Gabe [Enter] 1 $ expr 10 \> 20 [Enter] 0 유닉스프로그래밍 - 상명대학교 26
루프 (loop) 구조 반복구조 문장이나명령어를반복하기위해사용 프로그래머에게많은기능과유연성을제공 세가지반복구조를가짐 for, while, until for 루프 : for-in-done 구조 지정한숫자만큼명령어를수행하는기능을제공 <for_in_done.sh> for count in 1 2 3 10 do echo "in the for $count times" done exit 유닉스프로그래밍 - 상명대학교 27
루프 (loop) 구조 for-in-done 구조사용예 <for_in_done_2.sh> if [ $# -ne 2 ] then echo "Usage: $0 old_file_suffix new_file_suffix" exit 1 fi for file in *.$1 do mv $file `basename $file $1`$2 done exit 0 유닉스프로그래밍 - 상명대학교 28
루프 (loop) 구조 while 루프 : while-do-done 구조 지정된숫자만큼명령어를수행하는기능을제공 for 루프와달리조건 (condition) 이참인경우에만루프를수행 <while_do_done.sh> carryon=y while [ "$carryon" = Y ] do echo -e "I do the job as long as you type Y: \c" read carryon done echo "Good job!" exit 유닉스프로그래밍 - 상명대학교 29
루프 (loop) 구조 until 루프 : until-do-done 구조 루프의조건이거짓인동안에만명령어를반복하는점을제외하고는 while과매우유사 첫번째수행에서루프가참이라면, 반복구문은한번도수행되지않는경우가발생 <until_do_done.sh> i=1 until [ "$i" -gt 10 ] do echo " i : $i" let i=i+1 done echo "Good job!!" exit 유닉스프로그래밍 - 상명대학교 30