[제2장] 쉘 프로그래밍
=================================================================
* Subject : [제2장] 쉘 프로그래밍
* Writer: w0rm9 (research.hackerschool.org)
* Date: 2004/01/14
=================================================================
/* 다 알고있는 설명은 빼고, 필요한 부분만 정리해봤습니다. */
# : 주석문
#! : 스크립트를 해석할 인터프리터 쉘 지정 (예: #!/bin/sh)
=================================================================
0x01. 변수 사용
사용법) 변수이름=값
테스트)
[w0rm9@work SHELL]$ w0rm9=badnom
[w0rm9@work SHELL]$ echo w0rm9
w0rm9
[w0rm9@work SHELL]$ echo $w0rm9
badnom
[w0rm9@work SHELL]$ echo '$w0rm9'
$w0rm9
[w0rm9@work SHELL]$ echo "$w0rm9"
badnom
=================================================================
0x02. 특수 변수
사용법)
$# : 매개변수 수
$* : 매개변수 전체를 스트링으로
$$ : PID
$! : 백그라운드에서 마지막으로 실행된 작업의 PID
$@ : $*와 동일
$- : 쉘의 현재 옵션
$? : 마지막 실행된 명령의 상태
$n : n번째 argument
테스트)
[w0rm9@work SHELL]$ cat var.sh
#!/bin/sh
localVar="w0rm9 in WiseGuys"
curPath=pwd
echo "Your Home Directory is $HOME"
echo "Your local variable is $localVar"
echo "Your arguments number is $#"
echo "all arguments in a single line $*"
echo "Your process ID is $$"
echo "Arguments in quotes $@"
echo "Current shell option $-"
echo "Exit status $?"
echo "Your script name is $0"
echo "Your first argument is $1"
echo "Your second argument is $2"
[w0rm9@work SHELL]$ chmod u+x var.sh
[w0rm9@work SHELL]$ ./var.sh w0rm9 babo
Your Home Directory is /home/w0rm9
Your local variable is w0rm9 in WiseGuys
Your arguments number is 2
all arguments in a single line w0rm9 babo
Your process ID is 4376
Arguments in quotes w0rm9 babo
Current shell option hB
Exit status 0
Your script name is ./var.sh
Your first argument is w0rm9
Your second argument is babo
=================================================================
0x03. 외부 프로그램 실행결과를 변수에 저장
사용법) 변수=$(명령)
변수=`명령`
테스트)
[w0rm9@work SHELL]$ var1=$(id)
[w0rm9@work SHELL]$ echo "$var1"
uid=519(w0rm9) gid=519(w0rm9) groups=519(w0rm9)
[w0rm9@work SHELL]$ var2=`id`
[w0rm9@work SHELL]$ echo "$var2"
uid=519(w0rm9) gid=519(w0rm9) groups=519(w0rm9)
=================================================================
0x04. 파일 체크
사용법)
[ 파일비교연산자 파일 ] // [ ] 사이에 공백
-a : 파일 존재?
-b, -c, -d, -f, -h, -L, -S : 파일 유형 검사
-k : sticky bit 설정 유무
-r, -w, -x : 읽기, 쓰기, 실행 가능?
-s : 파일 크기가 0보다 큰지?
FILE1 ?nt FILE2 : newer than
FILE1 ?ot FILE2 : older than
테스트)
[w0rm9@work SHELL]$ [ -s var.sh ] // var.sh의 크기가 0보다 큰지 체크
[w0rm9@work SHELL]$ echo $? // 참이면 0
0 // var.sh가 0보다 크다는 뜻
=================================================================
0x05. 문자열 체크
사용법)
[ 스트링비교연산자 “문자열” ]
= : 같다.
!= : 같지 않다.
-z : NULL이면 참
-n : NULL이 아니면 참
테스트)
[w0rm9@work SHELL]$ [ "hello" = "hi" ]
[w0rm9@work SHELL]$ echo $?
1
[w0rm9@work SHELL]$ [ -z "" ]
[w0rm9@work SHELL]$ echo $?
0
[w0rm9@work SHELL]$ [ -n "" ]
[w0rm9@work SHELL]$ echo $?
1
=================================================================
0x06. 숫자 체크
사용법)
[ “숫자” 숫자비교연산자 “숫자” ]
-eq : 같다.
-ne : 같지 않다.
-lt : 작다.
-le : 같거나 같다.
-gt : 크다.
-ge : 크거나 같다.
테스트)
[w0rm9@work SHELL]$ [ "3" -gt "4" ] //3이 4보다 크다?
[w0rm9@work SHELL]$ echo $?
1 // 거짓
[w0rm9@work SHELL]$ [ "3" -lt "4" ] //3이 4보다 작다?
[w0rm9@work SHELL]$ echo $?
0 //참
=================================================================
0x07. if문
사용법) 조건1이 참이면 실행명령1 실행, 조건1이 거짓이면 실행명령2 실행
-----------------------
if 조건1; then
실행 명령1
else
실행 명령2
fi
-----------------------
또는
-----------------------
if 조건1
then
실행 명령1
else
실행 명령2
fi
-----------------------
테스트)
[w0rm9@work SHELL]$ cat > if.sh
#!/bin/sh
input=$(echo $1 | tr "[a-z]" "[A-Z]")
if [ "$input" = "HI" ]
then
echo "Your input is $input"
echo "HI"
elif [ "$input" = "HELLO" ]
then
echo "Your input is $input"
echo "HELLO"
else
echo "Your input is $input"
fi
[w0rm9@work SHELL]$ chmod u+x if.sh
[w0rm9@work SHELL]$ ./if.sh w0rm9
Your input is W0RM9
[w0rm9@work SHELL]$ ./if.sh hi
Your input is HI
HI
[w0rm9@work SHELL]$ ./if.sh hello
Your input is HELLO
HELLO
=================================================================
0x08. case문
사용법) 판단값의 패턴과 일치여부에 의해 실행명령 실행
-----------------------
case 판단값 in
패턴1)
실행명령
;;
패턴2)
실행명령
;;
*) --이외의 조건 처리
실행명령
;;
esac
-----------------------
테스트)
[w0rm9@work SHELL]$ cat > case.sh
#!/bin/sh
case $1 in
start)
echo "strating My deamon...[OK]"
exit 0
;;
stop)
echo "stopping My deamon...[OK]"
exit 0
;;
restart)
echo "stopping My deamon...[OK]"
echo "strating My deamon...[OK]"
exit 0
;;
*)
exit 1
;;
esac
[w0rm9@work SHELL]$ ./case.sh
[w0rm9@work SHELL]$ ./case.sh start
strating My deamon...[OK]
[w0rm9@work SHELL]$ ./case.sh stop
stopping My deamon...[OK]
[w0rm9@work SHELL]$ ./case.sh restart
stopping My deamon...[OK]
strating My deamon...[OK]
[w0rm9@work SHELL]$
=================================================================
0x09. for문
사용법) 변수를 목록만큼 실행명령 실행
------------------------
for 변수명 in 목록
do
실행명령
done
------------------------
테스트)
[w0rm9@work SHELL]$ cat > for.sh
#!/bin/sh
for i in 1 2 3 4 5 6 7 8 9
do
for j in 1 2 3 4 5 6 7 8 9
do
result=`expr $i \* $j`
echo "$i * $j = $result"
done
done
[w0rm9@work SHELL]$ chmod u+x for.sh
[w0rm9@work SHELL]$ ./for.sh
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
1 * 5 = 5
1 * 6 = 6
1 * 7 = 7
1 * 8 = 8
1 * 9 = 9
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
...중략...
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
=================================================================
0x10. while문
사용법) 조건이 참이면 실행명령 실행
----------------------
while 조건
do
실행명령
done
----------------------
테스트)
[w0rm9@work SHELL]$ cat > while.sh
#!/bin/sh
i=1
result=0
while [ $i -le 10 ]
do
result=`expr $result + $i`
i=`expr $i + 1`
done
echo "1 to 10 : $result"
[w0rm9@work SHELL]$ chmod u+x while.sh
[w0rm9@work SHELL]$ ./while.sh
1 to 10 : 55
=================================================================
0x11. until문
사용법) 조건이 거짓이면 실행명령 실행
----------------------
until 조건
do
실행명령
done
----------------------
테스트)
[w0rm9@work SHELL]$ cat > until.sh
echo '1 to 10 : $resul"
#!/bin/sh
i=1
result=0
until [ $i -gt 10 ]
do
result=`expr $result + $i`
i=`expr $i + 1`
done
echo "1 to 10 : $result"
[w0rm9@work SHELL]$ chmod u+x until.sh
[w0rm9@work SHELL]$ ./until.sh
1 to 10 : 55
=================================================================
0x11. break, continue
사용법) C언어와 유사
테스트)
[w0rm9@work SHELL]$ cat > break.sh
#!/bin/sh
i=0
result=0
while [ $i -le 9 ]
do
i=`expr $i + 1`
if [ $i -eq 5 ]
then
echo “breaking loop”
break
fi
result=`expr $i + $result`
echo "result is $result"
done
[w0rm9@work SHELL]$ chmod u+x break.sh
[w0rm9@work SHELL]$ ./break.sh
result is 1
result is 3
result is 6
result is 10
“breaking loop”
[w0rm9@work SHELL]$ cat > continue.sh
#!/bin/sh
i=0
result=0
while [ $i -le 9 ]
do
i=`expr $i + 1`
if [ $i -eq 5 ]
then
echo "skipping loop"
continue
fi
result=`expr $i + $result`
echo "result is $result"
done
[w0rm9@work SHELL]$ chmod u+x continue.sh
[w0rm9@work SHELL]$ ./continue.sh
result is 1
result is 3
result is 6
result is 10
skipping loop
result is 16
result is 23
result is 31
result is 40
result is 50
=================================================================
0x12. 함수
사용법)
----------------------------------
함수이름() -- function label
{
실행명령
-- function body
}
----------------------------------
함수의 반환형태)
return : 가장 마지막 수행 명령의 상태 반환
return 0 : 에러 없음
return 1 : 에러
테스트)
[w0rm9@work SHELL]$ cat > func.sh
#!/bin/sh
greeting()
{
echo “Hello World”
}
greeting
[w0rm9@work SHELL]$ chmod u+x func.sh
[w0rm9@work SHELL]$ ./func.sh
“Hello World”
=================================================================
감사합니다. _eof_
