[제2장] 쉘 프로그래밍

돼지털라이프 | 2007/06/25 18:55

=================================================================
  * 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_

Trackback Address :: http://badnom.com/trackback/284
Name
Password
Homepage
Secret
< PREV |  1  |  ...  748  |  749  |  750  |  751  |  752  |  753  |  754  |  755  |  756  |  ...  983  |  NEXT >