BASH Shell Script 3rd Lab 1. 쉘스크립트 간단한쉘스크립트 $ vi hello.sh (hello.sh) echo hello world $ chmod 755 hello.sh $./hello.sh hello world #! 은쉘에게이프로그램을실행하기위해서 #! 다음에오는아규먼트를실행프로그램으로사용한다는것을알려주기위해서사용된다. Unix/Linux system 은 Winws 와달리파일의확장자명 (.exe.com 등 ) 으로실행파일유무를결정하지않으며, 파일권한설정의변경을통하여실행파일로결정한다. 따라서스크립트파일을실행하기위해서는파일에실행권한을주어야한다. 2. 주석 "#" 에서부터라인의마지막까지가주석으로처리된다. # 만든이 : comp-ta # 하는일 : hello world 를출력한다. echo "hello world" # 문자열을출력한다. 3. 변수 C 언어와같은변수선언을필요로하지않는다. 기본적으로데이터를 string( 문자열 ) 로저장한다.( 수치를대입해도실제수치가아닌문자열이저장된다.) 따라서타입이없고아무값이나저장할수있다. 변수의값을사용할때는변수명앞에 "$" 를붙여서사용하고, 값을대입할때는 "$" 를붙이지않는다. 변수에데이타를저장하기위해서는대입연산자 "=" 를사용한다. 대입연산자와, 피연산자 / 연산자사이에는공백이존재하면안된다. varname=value 1
산술연산 : 모든것이문자열로저장되기때문에산술연산을하기위해서는변수 =$(( 산술식 )) 과같이사용. a=1 b=2 c=$(($a+$b)) echo $c (3 출력 ) 4. 명령행인자 (argument) $1~ $n - 넘겨진인자들 $* - 스크립트에전달된인자들을모아놓은문자열. 하나의변수에저장되며 IFS 환경변수의첫번째문자로구분된다. (IFS : internal eld separator) $@ - $* 과같다. 다만구분자가 IFS 변수의영향을받지않는다. $0 - 실행된쉘스크립트이름 $# - 스크립트에넘겨진인자의갯수 (test1.sh) echo "This Script Executable File : $0" echo "Argument Count : $#" echo "Argument List \$* : $*" echo "Argument List \$@ : $@" echo "Argument 1 : $1" echo "Argument 2 : $2" echo "Argument 3 : $3" echo "Argument 4 : $4" ( 실행 ) $chmod 755 test1.sh $./test1.sh a1 a2 a3 a4 This Script Executable File :./test1.sh Argument Count : 4 Argument List $* : a1 a2 a3 a4 Argument List $@ : a1 a2 a3 a4 Argument 1 : a1 Argument 2 : a2 Argument 3 : a3 Argument 4 : a4 5. 제어구조 if / 조건을 test 하여참이면 부분을, 거짓이면 부분을실행. test 조건들은 "[ ]" 사이에쓰면된다. "[" 과 "]" 사이에는반드시공백문자가들어가야한다. 변수값, 파일특징, 명령의실행여부등다양한 test 조건이있다. 2
if condition statements [elif condition statements...] [ statements] if [ $1 -lt $2 ] echo $1 is less than $2 elif [ $1 -gt $2 ] echo $1 is greater than $2 echo $1 equals to $2 - 참고 : test 명령조건문자열비교 [ string ] - string 이빈문자열이아니라면참 [ string1 = string2 ] - 두문자열이같다면참 [ string1!= string2 ] - 두문자열이다르면참 [ -n string ] - 문자열이 null( 빈문자열 ) 이아니라면참 [ -z string ] - 문자열이 null( 빈문자열 ) 이라면참산술비교 [ expr1 -eq expr2 ] - 두표현식값이같다면참 ('EQual') [ expr1 -ne expr2 ] - 두표현식값이같지않다면참 ('Not Equal') [ expr1 -gt expr2 ] - expr1 > expr2 이면참 ('Greater Than') [ expr1 -ge expr2 ] - expr1 >= expr2 이면참 ('Greater Equal') [ expr1 -lt expr2 ] - expr1 < expr2 이면참 ('Less Than') [ expr1 -le expr2 ] - expr1 <= expr2 이면참 ('Less Equal') [! expr ] - expr 이참이면거짓, 거짓이면참 [ expr1 -a expr2 ] - expr1 AND expr2 의결과 ( 둘다참이면참, 'And') [ expr1 -o expr2 ] - expr1 OR expr2 의결과 ( 둘중하나만참이면참, 'Or') 파일조건 [ -b FILE ] - FILE 이블럭디바이스이면참 [ -c FILE ] - FILE 이문자디바이스이면참. [ -d FILE ] - FILE 이디렉토리이면참 [ -e FILE ] - FILE 이존재하면참 [ -f FILE ] - FILE 이존재하고정규파일이면참 [ -g FILE ] - FILE 이 set-group-id 파일이면참 [ -h FILE ] - FILE 이심볼릭링크이면참 [ -L FILE ] - FILE 이심볼릭링크이면참 [ -k FILE ] - FILE 이 Sticky bit 가셋팅되어있으면참 [ -p FILE ] - True if le is a named pipe. [ -r FILE ] - 현재사용자가읽을수있는파일이면참 [ -s FILE ] - 파일이비어있지않으면참 [ -S FILE ] - 소켓디바이스이면참 [ -t FD ] - FD 가열려진터미널이면참 [ -u FILE ] - FILE 이 set-user-id 파일이면참 [ -w FILE ] - 현재사용자가쓸수있는파일 (writable le) 이면참 [ -x FILE ] - 현재사용자가실행할수있는파일 (Executable le) 이면참 [ -O FILE ] - FILE 의소유자가현재사용자이면참 [ -G FILE ] - FILE 의그룹이현재사용자의그룹과같으면참 3
[ FILE1 -nt FILE2 ] - : FILE1 이 FILE2 보다새로운파일이면 ( 최근파일이면 ) 참 [ FILE1 -ot FILE2 ] - : FILE1 이 FILE2 보다오래된파일이면참 [ FILE1 -ef FILE2 ] - : FILE1 이 FILE2 의하드링크파일이면참 for 지정된범위안에서루프를수행한다. 범위는어떤집합도가능하다. (Bash 2.03 버전이후버전 ) C style 의 for loop 사용가능 - 아래 3 문장은모두같은의미이다 - for a in 1 2 3 4 5 6 7 8 9 10 for a in $(seq 1 10) for ((a=0;a<10;a++)) 범위가하나의 string 이라면 IFS 를이용해구분가능. [in list] 를생략한다면기본값은 $@ for name [in list] statements that can use $name. ne IFS=: for dir in $PATH ls ld $dir ne while 어떤조건이참인동안코드를반복 while condition statements... ne count=0 while [ $count -lt 10 ] echo $count count=$(($count+1)) ne until 어떤조건이참일때까지 ( 거짓인동안 ) 반복 until condition statements... ne count=0 until [ $count -gt 10 ] echo $count count=$(($count+1)) ne case C 의 switch 구문과비슷한역할을함 C 의 switch 구문은정수나문자같은단순한값을검사하는반면, Bash 의 case 는 4
와일드카드 (?, *) 사용이허락되는어떤패턴을놓고문자열을검사 case expression in pattern1 ) statements ;; pattern2 ) statements ;;... esac case $1 in *.jpg ) echo jpg: Graphic File!! ;; *.txt ) echo txt: Text File!! ;; * ) echo Unknown File!! ;; esac select Korn Shell, Bash Shell 에만존재 간단한메뉴를제공 select 의루프내에서는자동적으로루프를벗어날수없기때문에반드시 break 문등을사용해서루프를벗어나야한다. prompt string 을변경하기위해서는쉘변수 PS3 를이용. select name [in list]; statements that can use $name...... ne echo " 다음중 scripting language 에속하는것은?" PS3= 숫자를선택하세요 : select var in "Bash script" "C/C++ "Java "Exit" if [ "$var" = "Bash script" ] echo " 정답입니다." break elif [ "$var" = "Exit" ] echo " 종료합니다." exit 1 echo "$var 을선택하셨습니다. 오답입니다." echo " 다음중 scripting language 에속하는것은?" ne cf.) read : 직접사용자입력을받음. 5
echo 이름을입력해주세요 : read NAME echo "Hi $NAME!" 6. Quoting Single Quotes Single Quotes 안의모든특수문자를보통문자로취급 Single Quotes 안에또다른 Single Quote 를쓸수없음 $ echo 2 * 3 > 5 is a valid inequality. (X) $ echo '2 * 3 > 5 is a valid inequality. (O) $ echo Hatter's tea party (X) $ echo Hatter\'s tea party (O) $ echo 'Hatter'\''s tea party' (O) Double Quotes Weak Single Quotes Single Quotes 와달리 $, `(backquote), ( 이스케이프 ) 는처리 문자열안에서다음을참조할때사용 - 변수확장 : $varname - 명령 : $(command) 혹은 `command` -single quote 가아니라 backquote 임. - 산술연산구문 : $((1+1)) $ echo "2 * 3 > 5 is a valid inequality." $ echo "Hatter\'s tea party" $ echo "path=$path" $ echo "current directory=$(pwd)" $ echo "current directory=`pwd`" $ echo "1 + 1 = $((1+1))" 7. 함수 다른프로그램언어에서와같이코드를재사용하거나모듈화를위해함수를사용 함수는함수가불리기전에정의되어야한다. (C 처럼함수를미리선언하는방법은없음 ) parameter : 함수는자신에게넘어온인자를 $1, $2 와같이인자의위치로참조한다. return value : 함수는반드시정수값만리턴할수있다. 이리턴값은 $? 변수에저장된다. 6
add() { } result=$(($1+$2)) return $result a=3 b=5 add $a $b sum=$? echo "$a + $b = $sum" 8. Backup script code if [ -z $1 ] [ -z $2 ]; echo usage: $0 source_dir target_dir SRC_DIR=$1 DST_DIR=$2 OF=output.$(date +%y%m%d%h%m%s).tar.gz if [ -d $DST_DIR ]; tar -cvzf $DST_DIR/$OF $SRC_DIR mkdir $DST_DIR tar -cvzf $DST_DIR/$OF $SRC_DIR 9. 참고자료 - http://wiki.kldp.org/wiki.php/%c0%c0%bf%eb%c7%c1%b7%ce%b1%d7%b7% A5#s-1.1 7