1. Shell과 Shell programming이란? 
2. 쉘 문법 - 변수, 연산 
3. 쉘 문법 - 조건문,제어구조 
4. 쉘 문법 - 목록 
5. 쉘 문법 - 함수 
6. 쉘 문법 - 명령어 
7. 쉘 문법 - 명령실행 
8. 쉘 문법 - 쉘 스크립트 내부에서 입력 전달 
9. 쉘 문법 - 디버깅 
10. 우리가 자주 쓰는 쉘 스크립트 
11. 참고자료 
1. Shell과 Shell programming이란? 
쉘이란 간단히 생각해서 MS-DOS의 명령어 처리기인 command.com과 비슷하다고 할 수 
있다. 그렇지만 그 기능은 MS의 것보다 엄청나다고 할 수 있다. 우리가 리눅스를 사용 
하면서 쓰고 있는 것들의 대부분이 쉘 스크립으로 짜여있는 것만 봐도 알수 있다. 
쉘은 사용자를 유닉스(리눅스) 시스템에 이어주는 인터페이스로써 쉘을 통해 명령어를 
입력하면 쉘은 해당 명령을 운영체제가 실행할 수 있도록 전달해주는 역활을 한다. 
쉘의 종류는 다양하나 흔히 우리들이 쓰는 것은 bash와 tcsh이다. 
+------------+-------------------------------------------------------------+ 
|셀 명칭     | 간단한 역사                                                 | 
+------------+-------------------------------------------------------------+ 
|sh(Bourne)  | 최초의 쉘                                                   | 
+------------+-------------------------------------------------------------+ 
|csh,tcsh,zsh| C 쉘, Berkeley 유닉스 프레임의 Bill Joy가 만듦.             | 
+------------+-------------------------------------------------------------+ 
|ksh,pdksh   | Korn 쉘, pdksh는 public domain Korn쉘. David Korn이 만듦    | 
+------------+-------------------------------------------------------------+ 
|bash        | GNU 프로젝트에서 나온 linux의 중요한 프로그램. Bourne Agine | 
|            | shell이라도 부른다.                                         | 
+------------+-------------------------------------------------------------+ 
|rc          | csh보다 더 C에 가깝다. GNU 프로젝트의 결과물                | 
+------------+-------------------------------------------------------------+ 
쉘 프로그래밍은 빠르고 간편하게 짤 수 있는 인터프리터 언어로써 컴파일할 필요가 
없으며 한줄씩 실행시킬 수 있는 장점이 있지만 정밀한 처리나 빠른 처리를 요구하는 
것엔 부적합하다고 할 수 있다. 쉘 프로그래밍 작성방법은 두가지로써 하나는 실행할 
명령을 순서대로 입력하여 대화식으로 실행하는 것이며, 다른 하나는 실행할 명령을 
파일에 저장한 다음 실행하는 것이다. 
2. 쉘 문법 - 변수, 연산 
변수는 환경변수와 인자변수, 일반변수로 구분되며 변수를 사용하기 위해서는 C와는 
달리 처음 선언해주는 것이 아니라 변수를 처음 사용할때 생성한다. 변수는 기본적으 
로 문자열로 저장이 되며 변수의 내용을 보려면 $를 앞에 붙인후 echo명령으로 호출하 
게 된다. 
(변수를 인용처리 하기위해서는 작은 따옴표(')로 $변수를 묶거나 $ 앞에 문자를 붙 
임으로써 $의 특별한 의미를 없애버릴 수 있다. 또한 변수의 값에 공백이 포함되면 
앞뒤로 따옴표로 묶어주어야 하며, 등호(=) 앞뒤에 공백을 넣지 말아야 한다) 
1) 환경변수 
쉘을 기동하면 기본적으로 세팅되는 변수들로써 일반적으로 사용자정의 변수와 구분 
하기 위해서 대문자로 표현된다. 핵심적인 변수는 다음과 같다. 
+----------+------------------------------------------------------------+ 
| 환경변수 | 설명                                                       | 
+----------+------------------------------------------------------------+ 
| $HOME    | 사용자 홈 디렉토리                                         | 
+----------+------------------------------------------------------------+ 
| $PATH    | 명령어 찾기에 사용되는 콜론(:)으로 구분되는 디렉토리 목록  | 
+----------+------------------------------------------------------------+ 
| $IFS     | 입력필드 구분자. 쉘상에서 입력을 읽어들일 때 낱말을 구분   | 
|          | 하기 위한 목적으로 사용되는 문자 목록, 보통은 스페이스, 탭,| 
|          | 개행문자임                                                 | 
+----------+------------------------------------------------------------+ 
| $0       | 쉘 스크립트의 이름                                         | 
+----------+------------------------------------------------------------+ 
| $#       | 전달된 인자의 개수                                         | 
+----------+------------------------------------------------------------+ 
| $$       | 쉘 스크립트의 프로세스 ID. 쉘 스크립트 내부에서 중복되지   | 
|          | 않는 파일의 이름을 만들 때 자주 사용됨                     | 
+----------+------------------------------------------------------------+ 
2) 인자변수 
쉘 스크립트에 인자를 넘겨줄때 그 인자들에 대한 정보를 가지고 있는 변수들로써 
전달되는 인자와 관련된 변수들은 다음과 같다 
+----------+------------------------------------------------------------+ 
| 인자변수 | 설명                                                       | 
+----------+------------------------------------------------------------+ 
| $1, $2.. | 스크립트로 전달된 인자                                     | 
+----------+------------------------------------------------------------+ 
| $*       | 스크립트로 전달된 인자 전체로, 하나의 변수에 저장되며 IFS  | 
|          | 환경 변수의 첫 번째 문자로 구분된다.                       | 
+----------+------------------------------------------------------------+ 
| $@       | $*와 비슷하나 IFS 환경 변수를 사용하지 않는다              | 
+----------+------------------------------------------------------------+ 
3) 일반변수 
일반변수는 특별한 제약이 없으며 대소문자의 구분만 명확히 하면 된다. 
예) #!/bin/sh 
echo "This Script Executable File : $0" 
echo "Argument Count : $#" 
echo "Process ID : $$" 
echo "Argument List $* : $*" 
echo "Argument List $@ : $@" 
echo "Argument 1 : $1" 
echo "Argument 2 : $2" 
-->실행 
$chmod 755 argument (or chmod a+x argument) 
$./test a1 a2 
3. 쉘 문법 - 조건문,제어구조 
1) test, [] 
쉘 스크립트에서 참거짓 값을 판단할 수 있는 것은 test와 []로 보통 같은 의미를 
지닌다. []명령어는 쉘 스크립트를 다른 프로그래밍 언어와 비슷하게 보이는 역할 
을 하기도 한다. 
a. 문자열 비교 
+--------------------+--------------------------------------------------+ 
| 문자열 비교        | 결과                                             | 
+--------------------+--------------------------------------------------+ 
| string             | string1이 빈 문자열이 아니면 참                  | 
+--------------------+--------------------------------------------------+ 
| string1 = string2  | 두 문자열이 같다면 참                            | 
+--------------------+--------------------------------------------------+ 
| string1 != string2 | 두 문자열이 같지 않다면 참                       | 
+--------------------+--------------------------------------------------+ 
| -n string          | 문자열이 null이 아니라면 참                      | 
+--------------------+--------------------------------------------------+ 
| -z string          | 문자열이 null이라면 참                           | 
+--------------------+--------------------------------------------------+ 
b. 산술 비교 
+-----------------------------+-----------------------------------------+ 
| 산술비교                    | 결과                                    | 
+-----------------------------+-----------------------------------------+ 
| expression1 -eq expression2 | 두 표현식 값이 같다면 참                | 
+-----------------------------+-----------------------------------------+ 
| expression1 -ne expression2 | 두 표현식 값이 같지 않다면 참           | 
+-----------------------------+-----------------------------------------+ 
| expression1 -qt expression2 | expression1이 expression2보다 크다면 참 | 
+-----------------------------+-----------------------------------------+ 
| expression1 -ge expression2 | expression1이 expression2보다 크거나    | 
|                             | 같다면 참.                              | 
+-----------------------------+-----------------------------------------+ 
| expression1 -lt expression2 | expression1이 expression2보다 작다면 참 | 
+-----------------------------+-----------------------------------------+ 
| expression1 -le expression2 | expression1이 expression2보다 작거나    | 
|                             | 같다면 참.                              | 
+-----------------------------+-----------------------------------------+ 
| ! expression                | expression이 거짓이라면 참,             | 
|                             | 참이라면 거짓                           | 
+-----------------------------+-----------------------------------------+ 
c. 파일 조건 
+---------------+-------------------------------------------------------+ 
| 파일 조건     | 결과                                                  | 
+---------------+-------------------------------------------------------+ 
| -d file       | file이 디렉토리라면 참                                | 
+---------------+-------------------------------------------------------+ 
| -e file       | file이 존재한다면 참                                  | 
+---------------+-------------------------------------------------------+ 
| -f file       | file이 정규파일이라면 참                              | 
+---------------+-------------------------------------------------------+ 
| -g file       | file상에 set-group-id가 설정되어 있다면 참            | 
+---------------+-------------------------------------------------------+ 
| -r file       | file이 읽기 가능하다면 참                             | 
+---------------+-------------------------------------------------------+ 
| -s file       | file의 크기가 0이라면 참                              | 
+---------------+-------------------------------------------------------+ 
| -u file       | file상에 set-user-id가 설정되어 있으면 참             | 
+---------------+-------------------------------------------------------+ 
| -w file       | file이 쓰기 가능하다면 참                             | 
+---------------+-------------------------------------------------------+ 
| -x file       | file이 실행가능하다면 참                              | 
+---------------+-------------------------------------------------------+ 
2) if 
명령의 결과를 테스트하여 조건적으로 적절한 구문의 그룹을 실행시킨다. 
a. 형식1(단일 if문) 
------------------------------------------------------------------------ 
if [조건] 
then 
문장 
fi 
------------------------------------------------------------------------ 
b. 형식2(if~else문) 
------------------------------------------------------------------------ 
if [조건] 
then 
문장 
else 
문장 
fi 
------------------------------------------------------------------------ 
c. 형식3(여러가지 조건 검사) 
------------------------------------------------------------------------ 
if [조건] 
then 
문장 
elif [조건] 
then 
문장 
else 
문장 
fi 
------------------------------------------------------------------------ 
3) for 
지정한 범위 안에서 루프를 돌리는데 사용된다. 범위에 사용되는 값은 어떠한 
문자열의 집합이라도 가능하다. 루프가 돌때마다 값1, 값2가 차례로 들어간다. 
---------------------------------------------------------------------------- 
for 변수 in 값1, 값2 ... 
do 
문장 
done 
---------------------------------------------------------------------------- 
4) while 
어떤 명령을 지정한 횟수만큼 실행시키기에는 부적합한 for루프를 보완하는 것으로 
실행 횟수가 불확실할때 편리하다. 
---------------------------------------------------------------------------- 
while 조건문 
do 
문장 
done 
---------------------------------------------------------------------------- 
5) until 
while과 비슷하나 조건이 참일동안 실행되는 것이 아니라 거짓일 동안 실행된다. 
---------------------------------------------------------------------------- 
until 조건문 
do 
문장 
done 
---------------------------------------------------------------------------- 
6) select 
원하는 리스트를 출력하고 그중 선택된 것을 돌려준다. 주의할 점은 select의 루프 
내에서 자동적으로 벗어날 수 없으므로 반드시 break문을 사용해서 벗어나야 한다. 
예) #!/bin/sh 
echo "What do you like?" 
select var in "Linux" "Windows9x" "Win2k" "Win31" "Exit" 
do 
if [ "$var" = "Linux" ]; then 
echo "You are a Linuxer!!!" 
exit 0 
elif [ "$var" = "Exit" ]; then 
echo "The question ended" 
exit 1 
else 
echo "$var is not the best way!!!" 
echo "What do you like?" 
fi 
done 
--> 결과 : What do you like? 
1) Linux 
2) Windows9x 
3) Win2k 
4) Win31 
5) Exit 
#? 
7) case 
여러 패턴을 검사하고 이에 적절한 구문을 실행시켜 주는 것으로 강력한 기능을 
가지고 있으며 쉘스크립에 많이 등장한다. 
--------------------------------------------------------------------------- 
case 변수 in 
패턴 [ | 패턴 ] ...) 문장 ;; 
패턴 [ | 패턴 ] ...) 문장 ;; 
.... 
esac 
--------------------------------------------------------------------------- 
4. 쉘 문법 - 목록 
여러 명령어를 실행할때 앞의 명령의 결과에 의해서 다음 행동이 결정되어야 할 경우 
AND나 OR조건을 사용해서 한번에 처리할 수 있다. 이것은 쉘 스크립트 뿐 아니라 명 
령행에서도 사용 가능하다. 
1) AND목록 
한번에 여러 명령을 한꺼분에 실행시킬 수 있다. AND 목록에서 이전의 명령이 성공 
했다면 다음번 명령을 수행한다. 왼쪽 구문부터 시작하여 그 결과값이 참이라면 
그 다음 명령어가 수행된다. 거짓이 반환되면 더이상 명령어를 실행하지 않는다. 
---------------------------------------------------------------------------- 
statment1 && statment2 && statment3 && ... 
---------------------------------------------------------------------------- 
2) OR목록 
어떤 하나의 명령의 수행이 성공할때까지 일련의 명령을 계속 수행한다. 명령의 수 
행이 성공하면 더 이상 목록 중의 다른 명령은 수행하지 않는다. 왼쪽 구문부터 
시작하여 그 결과값이 거짓이라면 오른편의 명령어가 수행된다. 참의 값이 반환되면 
실행을 멈춘다. 
---------------------------------------------------------------------------- 
statment1 || statement2 || statement3 || ... 
---------------------------------------------------------------------------- 
3) AND와 OR의 혼용 
아래와 같이 &&와 ||을 혼용하여 사용할수 있다. 참이면 문장1이 실행되고 거짓이 
면 문장2가 실행된다 
---------------------------------------------------------------------------- 
[ 조건 ] && 문장1 || 문장2 
---------------------------------------------------------------------------- 
예) [ -f file_one ] && command for true || command for false 
5. 쉘 문법 - 함수 
쉘 스크립 내부에 또는 다른 스크립트 파일에 함수를 정의해 놓고 사용할 수 있다. 
함수를 사용하면 코드를 최적화 할 수 있고 코딩이 간결해지며, 재사용이 가능하다. 
그러나 다른 스크립트 파일을 호출해서 함수를 실행할 경우, 가능은 하지만 스크립트 
의 실행시간이 길어지고 함수의 결과를 전달하는 것이 까다롭기 때문에 가급적이면 
외부 파일의 함수를 사용하지 않는 것이 좋다. 
----------------------------------------------------------------------------- 
function_name () { 
statments 
} 
----------------------------------------------------------------------------- 
함수를 사용하는 방법은 함수명(function_name) 뒤에 인자를 적어준다. 그리고 함수 
내부에서 지역(local)변수를 사용하고자 할 경우에는 변수명 앞에 local이란 예약어를 
적어주면 된다. 
6. 쉘 문법 - 명령어 
쉘 스크립트 안에서 사용할 수 있는 명령은 두 종류로써 하나는 내부명령어이고 다른 
하나는 프롬프트 상에서 실행시킬 수 있는 일반명령어이다. 내부명령이 외부명령보다 
좀 더 효율적이라는 것을 제외하면 실질적인 차이는 없다. 
1) break 
for, while이나 until에서 제어 조건을 만나기 전에 루프를 벗어날 때 사용한다. 
예) while true 
do 
if [ -f file_name ]; then 
break 
fi 
echo "file_name was not found" 
done 
exit 0 
2) : 명령 
의미없는(null) 명령으로 true를 대신해 논리값을 간단하게 하기 위해서 사용한다. 
while true와 같은 것을 while :와 같이 대체할 수 있으며, 변수의 조건을 지정할 
수 있다. 예) : $(var=value) 
3) continue 
C에서와 비슷하며 for, while 또는 until 루프의 변수를 다음 값을 가지게 하고 
다음 번 루프를 돌게 한다. 
4) .명령 
현재의 쉘에서 명령을 실행시킨다. 
5) echo 
개행문자를 포함한 문장을 간단하게 출력한다. (다음줄로 넘어간다) 
6) eval 
인자의 실제 값을 구하는데 사용한다. 
예) foo=10 
x=foo 
y='$'$x 
echo $y ==> 결과값 : $foo 
foo=10 
x=foo 
eval y='$'$x 
echo $y ==> 결과값 : 10 
7) exec 
현재 쉘을 다른 프로그램으로 대체하거나 파일을 읽기 모드로 열때 사용한다. 
8) exit n 
현재 쉘을 종료한다. 종료시 n값을 리턴한다. 
+----------+--------------------------------+ 
| 종료코드 | 설명                           | 
+----------+--------------------------------+ 
| 0        | 성공                           | 
+----------+--------------------------------+ 
| 1~125    | 스크립트에서 사용하는 에러코드 | 
+----------+--------------------------------+ 
| 126      | 파일이 실행되지 않았다         | 
+----------+--------------------------------+ 
| 127      | 해당 명령을 발견할 수 없다     | 
+----------+--------------------------------+ 
| 128이상  | 시그널이 발생했다.             | 
+----------+--------------------------------+ 
9) export 
해당 쉘에서 파생된 자식 프로세스에서 export한 환경변수는 본래 쉘에서 관리한다 
10) expr 
표현식의 값을 구하는 것으로 x='expr $x+1'과 같이 사용된다. 하지만 expr보다는 
$((계산식))을 사용한다. 
11) printf 
C에서의 printf와 흡사하다. 
형식 : printf "Format String" arg1 arg2 arg3 ... 
+-------------+----------------------------------------+ 
| 탈출 문자열 | 설명                                   | 
+-------------+----------------------------------------+ 
|             | 백슬래시() 문자                        | 
+-------------+----------------------------------------+ 
| a           | 경고음(벨 또는 비프음)                 | 
+-------------+----------------------------------------+ 
| b           | 백스페이스 문자                        | 
+-------------+----------------------------------------+ 
| f           | 폼피드 문자                            | 
+-------------+----------------------------------------+ 
| n           | 뉴라인(newline) 문자                   | 
+-------------+----------------------------------------+ 
| r           | 캐리지 리턴 문자                       | 
+-------------+----------------------------------------+ 
| t           | 탭 문자                                | 
+-------------+----------------------------------------+ 
| v           | 수직 탭 문자                           | 
+-------------+----------------------------------------+ 
| ooo         | 8진수로 표현되는 한 문자               | 
+-------------+----------------------------------------+ 
+-------------+----------------------------------------+ 
| 변환 식별자 | 설명                                   | 
+-------------+----------------------------------------+ 
| d           | 십진수 출력                            | 
+-------------+----------------------------------------+ 
| c           | 한 문자 출력                           | 
+-------------+----------------------------------------+ 
| s           | 문장 출력                              | 
+-------------+----------------------------------------+ 
| %           | %문자 출력                             | 
+-------------+----------------------------------------+ 
예) [lpay09@pay lpay09]$ printf "%sn" hello 
12) return 
쉘 함수에서 값을 반환할때 쓰인다. 
13) set 
쉘 내부에서 매개 인자를 설정한다. set의 인자로 쓰인 문자열은 공백에 의해 $1 
부터 차례대로 대입된다. 
예) #!/bin/sh 
echo the eate is $(date) 
set $(date) 
echo The month is $2 
exit 0 
--->결과 : the date is 일 2월 11 02:21:57 KST 2001 
The month is 2월 
14) shift 
쉘의 인자를 한자리씩 아래로(n->1로) 이동시킨다. 
예) #!/bin/sh 
echo $1 
shift 
echo $1 
shift 5 
echo $1 
실행 : [lpay09@pay lpay09]$ ./shift 1 2 3 4 5 6 7 8 9 10 
1 
2 
7 
15) trap 
쉘의 실행도중 시그널을 처리하는 시그널 처리기를 만드는 역할을 한다. 
----------------------------------------------------------------------------- 
trap command signal 
----------------------------------------------------------------------------- 
쉘 스크립트는 위에서 아래로 실행되므로 보호하려는 부분 이전에 trap명령을 사용 
한다. trap조건을 기본으로 사용하려면 명령에 - 를 넣으면 된다. 신호를 무시할려 
면 ''빈 문자열을 준다. 
예) trap 'rm -rf /tmp/my_tmp_file_$$' INT 
(INT는 보통 Ctrl+C를 눌렀을때 발생된다) 
16) unset 
변수나 함수를 제거한다. 
예) #!/bin/sh 
foo="Hello world" 
echo $foo 
unset foo 
echo $foo 
7. 쉘 문법 - 명령실행 
1) 외부 명령의 실행 결과를 변수에 집어넣어 변수의 값으로 사용하려면 $(command) 
구문을 이용하면 된다. 또는 `command`의 형식도 유효하다. 
---------------------------------------------------------------------------- 
변수=$(command) 
----------------------------------------------------------------------------- 
예) user=$(who) 
2) 산술 확장 
쉘에 있어서 변수는 모두 문자열로 저장이 되기 때문에 연산을 할려면 다음과 같은 
약간 복잡한 거쳐야 된다. 
---------------------------------------------------------------------------- 
변수 = $((산술식)) 
---------------------------------------------------------------------------- 
산술식내에는 변수($1,$와 같은)도 들어갈 수 있으며 숫자가 아닌 문자열, 또는 
문자열이 담겨있는 변수가 들어가면 그것들은 계산에서 제외된다. 
(0으로 간주되어 연산이 이루어지지 않는다) 
예) count=$(($count+1)) 
3) 매개변수 확장 
매개변수 확장이란 변수의 값을 문자열 등으로 대체하는 것으로 단순만 대체뿐만 
아니라 변수 내의 문자열을 조작하여 원하는 문자열만 추출할 수도 있다. 
+------------------+--------------------------------------------------------+ 
| 매개변수 확장    | 설명                                                   | 
+------------------+--------------------------------------------------------+ 
| ${param -default}| param이 존재하지 않으면 default로 대체                 | 
+------------------+--------------------------------------------------------+ 
| ${#param}        | param의 길이를 참조한다(가져온다)                      | 
+------------------+--------------------------------------------------------+ 
| ${param%word}    | 끝에서부터 word와 일치하는 parm의 최소부분(첫번째 일치)| 
|                  | 을 제거하고 나머지를 반환한다.                         | 
+------------------+--------------------------------------------------------+ 
| ${param%%word}   | 끝에서부터 word와 일치하는 parm의 최대부분(마지막 일치)| 
|                  | 을 제거하고 나머지를 반환한다.                         | 
+------------------+--------------------------------------------------------+ 
| ${param#word}    | 처음부터 word와 일치하는 parm의 최소부분(첫번째 일치)  | 
|                  | 을 제거하고 나머지를 반환한다.                         | 
+------------------+--------------------------------------------------------+ 
| ${param##word}   | 처음부터 word와 일치하는 parm의 최대부분(마지막 일치)을| 
|                  | 제거하고 나머지를 반환한다.                            | 
+------------------+--------------------------------------------------------+ 
예) #!/bin/sh 
unset foo 
echo ${foo:-bar} 
foo=fud 
echo ${foo:-bar} 
foo=/usr/bin/X11/startx 
echo ${foo#*/} 
echo ${foo##*/} 
foo=/usr/local/etc/local/networks 
echo ${foo%local*} 
echo ${foo%%local*} 
exit 0 
--> 결과 : bar 
fud 
usr/bin/X11/startx 
startx 
/usr/local/etc 
/usr 
8. 쉘 문법 - 쉘 스크립트 내부에서 입력 전달 (Here Documents) 
쉘 내부에서 명령어에 입력을 전달하는 방법으로 전달된 입력은 마치 키보드에서 입력 
한 것과 같이 행동한다. 
------------------------------------------------------------------------------- 
명령 << 종료문자열 
입력값 
종료문자열 
------------------------------------------------------------------------------- 
예) #!/bin/sh 
cat << !funy! 
Are funy? 
I'm a boy. 
!funy! 
다른 방법으로는 ed에디터와 조합으로 파일을 수정할 수 있다. 
예) #!/bin/sh 
ed text << !funy! 
%s/boy/girl 
w 
q 
!funy! 
text파일의 내용 : I'm a boy ---> 실행후 I'm a girl 
9. 쉘 문법 - 디버깅 
쉘 스크립틀르 디버깅하는 것은 매우 쉽지만 도움이 될만한 특별한 도구가 없다. 
따라서 echo문을 사용하여 변수의 내용을 살펴보거나, 문제가 있는 부분을 수동으로 
쉘에서 상호 대화식으로 입력하는 테스트를 할 수 있다. 
쉘의 명령행 옵션을 사용하거나 set명령을 사용하여 에러를 추적할 수 있다. 
+----------------+----------------+--------------------------------------------+ 
| 명령행 옵션    | set 옵션       | 설명                                       | 
+----------------+----------------+--------------------------------------------+ 
| sh -n script | set -o noexec  | 구문 에러만 체크한다.                      | 
|              | set -n         | 명령을 실행시키지 않는다                   | 
+----------------+----------------+--------------------------------------------+ 
| sh -v script | set -o verbose | 명령을 실행하기 전에 명령을 에코한다.      | 
|              | set -v         |                                            | 
+----------------+----------------+--------------------------------------------+ 
| sh -x script | set -o xtrace  | 명령행에서 명령을 처리한 다음 에코한다.    | 
|              | set -x         |                                            | 
|              | set -o nounset | 정의되지 않은 변수를 사용했을 때 에러를    | 
|              | set -u         | 출력한다.                                  | 
+--------------+----------------+--------------------------------------------+ 
(set의 옵션 플래그를 켤때는 -o를, 끌때는 +o를 사용한다.) 
쉘에서 아래와 비슷한 내용을 스크립트의 처음에 놓으면 어디에서 EXIT 시그널이 발생 
해서 종료했는지 확인할 수 있다. 
------------------------------------------------------------------------------- 
trap 'echo Exiting: critical variable = $critical variable' EXIT 
------------------------------------------------------------------------------- 
10. 우리가 자주 쓰는 쉘 스크립트 (httpd) 
1 : #!/bin/sh 
2 : # 
3 : # Startup script for the Apache Web Server 
4 : # 
5 : # chkconfig: 345 85 15 
6 : # description: Apache is a World Wide Web server. It is used to server  
7 : # HTML file and CGI 
8 : # processname: httpd 
9 : # pidfile: /var/run/httpd.pid 
10 : # config: /etc/httpd/conf/httpd.conf 
11 : 
12 : # Source function library. 
13 : . /etc/rc.d/init.d/functions 
14 : 
15 : # See how we were called 
16 : case "$1" in 
17 : start) 
18 : echo -n "Starting httpd : " 
19 : daemon httpd 
20 : echo 
21 : touch /var/lock/subsys/httpd 
22 : ;; 
23 : stop) 
24 : echo -n "Shutting down http : " 
25 : killproc httpd 
26 : echo 
27 : rm -f /var/lock/subsys/httpd 
28 : rm -f /var/run/httpd.pid 
29 : ;; 
30 : status) 
31 : status httpd 
32 : ;; 
33 : restart) 
34 : $0 stop 
35 : $0 start 
36 : ;; 
37 : reload) 
38 : echo -n "Reloading httpd : " 
39 : killproc httpd -HUP 
40 : echo 
41 : ;; 
42 : *) 
43 : echo "Usage : $0 {start|stop|restart|reload|status}" 
44 : exit 1 
45 : esac 
46 : 
47 : exit 0
2009. 3. 30.
피드 구독하기:
댓글 (Atom)
 
 
 
댓글 없음:
댓글 쓰기