원글(이글루): 2009-12-29 20:22:54
발췌 : http://www.4offline.org/maincontent.htm
쉘은 유닉스의 심장부인 커널과 사용자간의 인터페이스를 제공한다.
쉘은 입력되는 명령어를 해석하고 파일과 변수의 대치, 입출력 리다이렉션, 실행 파일의 준비,
인터페이스 프로그램의 초기화를 수행한다.
쉘은 자식 프로세스를 생성하여 그 실행을 관리할 수 있으며, 사용자의 환경변수를 보존한다.
또한 쉘은 강력한 프로그래밍 언어이기도 하다.
—————————————————————————————–
Bounrne 쉘
기초
쉘의 기동
환경
옵션
특수문자
변수
사용자 정의 변수
환경변수
위치변수 혹은 쉘 인자
Shell Script Programming
조건 테스트
반복과 루프제어
쉘과 친해지기
—————————————————————————————–
Shell 기초
쉘의 기동
Shell을 가동하거나 실행할때, 사용 가능한 옵션이 있다.
Shell Script의 문법을 검사할때, -n 옵션을 사용하면 실행하지는 않고 Script를 판독한다.
디버깅하는 중이라면, -x 옵션을 사용하여 Trace 모드를 설정할 수 있다.
다음은 대부분의 유닉스에서 사용가능한 Bourne Shell의 옵션이다.
-a 익스포트할 모든 변수표시
-c “string” string으로부터 명령어판독
-e 비대화형모드설정
-f 쉘파일명 생성을 불가상태로 설정
-h 정의된 대로 함수를 위치시키고 기억해둠
-i 대화형 모드
-k 명령에 대한 인자를 환경에 삽입
-n 명령어를 판독, 실행하지는 않음.
-r 제한모드 설정
-s 표준입력으로 명령어 입력받음
-t 한 명령을 수행하고, 쉘을 마침
-u 치환도중 설정되지 않은 변수에 대하여 에러발생
-v 다변모드 설정, 쉘 입력행을 표시
-x 추적모드 설정, 명령어의 실행 모습을 표시
환경
사용자의 홈디렉토리에 .profile 파일이 있다.
여기서 시스템 관리자나 사용자는 언제든지 자신의 쉘 환경을 변경할 수 있다.
실행파일 경로에 디렉토리를 추가할면 .profile에 다음을 덧붙이면 된다.
PATH=$PATH:/sql/bin; export PATH
적용하기 위해서는 로그인을 다시하거나
source .profile 해주어야한다.
특수문자
쉘에 의해 자동적으로 설정하여 특별한 쉘 변수를 나타내는 특수 문자들이 있다.
모든 변수들과 마찬가지로 그 문자들 역시 $가 앞에 붙는다.
$# 명령 쉘에 주어진 인자의 수
$- 쉘의 명령어에 의해 설정되는 플래그
$? 마지막 명령어 수행 결과에 의한 상태값
$$ 현재 쉘의 프로세스 번호
$! 마지막 자식 프로세스의 프로세스번호
$@ 모든 인자, 각각은 큰 따옴표 처리된다.
$* 모든인자, 전체가 큰 따옴표 처리된다.
$n ‘n’이 위치한 곳의 위치 인자값
$0 현재 쉘의 이름
—————————————————————————————–
변수
사용자 정의 변수
대부분의 유닉스 명령어는 소문자이므로 쉘 프로그래밍에서는 변수명을 대문자로 만드는 것이 상례이다.
그러나 꼭 대문자를 써야하는 것은 아니지만, 그렇게 함으로 프로그램에서 변수를 확인하기가 쉬워진다.
[root@www backhome]# COUNT=1
[root@www backhome]# NAME=Saridong
[root@www backhome]# echo $COUNT
1
[root@www backhome]# echo $NAME
Saridong
Default 값 치환
${variable:-value}
변수의 값이 설정되지 않은 경우에 변수를 설정한 값으로 치환한다. 위의 예에서 보자.
[root@www backhome]# echo ${name:-HHH}
HHH
할당
${variable:=value}
치환할 변수가 설정된 경우에만
${variable:+value}
—————————————————————————————–
Shell Script Programming
쉘 프로그램에서 사용자가 할 수 있는 것은 결국 여러 명령어들을 하나의 명령어로 만들어 실행하는 것이다.
일반 프로그래밍 언어와 마찬가지로, 쉘은 사용자가 보다 유용한 프로그램을 만들 수 있게 하는 특성들을 가지고 있다.
데이터변수, 인자전달, 의사결정, 흐름제어, 데이터 입출력, 서브루틴과 인터럽트 조작 등이 그것이다.
이러한 특성을 이용하여, 모든 컴퓨터 언어가 목적하는 바처럼, 반복 작업을 자동화 할 수 있다.
본 강의에서는 사용자 계정의 풀백업을 하는 것으로 예를 들며 마친다. 물론 기본적인 예들도 함께..
어찌해서 쉘스크립트를 짯다고 하자, 만약에 아직 짜본적이 없다하더라도 그냥 보자.
어떻게 실행할까?
1. bash script-name
script-name이라는 스크립트를 bash야 실행해라
2. chmod +x script-name
chmod로 실행가능하게 해준다
주석은 # 로한다. 한 라인이 주석이된다.
# 요렇게 쓰면 된다 이기야.
산술처리
expr intger operator integer
+ 두 정수를 더한다.
– 두번째 정수에서 첫번째 정수를 뺀다.
* 두 정수를 곱한다.
/ 첫번째 정수를 두번째 정수로 나눈다.
% 나머지를 하고 남은 수
[root@www backhome]# expr 2 + 1
3
[root@www backhome]# expr 2+1 #주의하장. 빈칸이 있어야한다.
2+1
주의) 곱셈을 위해서는
[root@www backhome]# expr 4 \* 10 #이와 같이 escape처리해야한다 why *는 모든 것으로 치환되려한다.
40
문자형 데이터검사
str1=str2 str1과 str2가 같은 길이, 같은 문자로 구성되어 있으면 참
str1!=str2 str1과 str2가 다르면 참
-n str1 str1의 길이가 0보다 크면(널이 아니면) 참
-z str1 str1이 널(길이가 0)이면 참
str1 str1이 널이 아니면 참
숫자형 데이터검사
int1 -eq int2 int1과 int2가 같으면 참
int1 -ne int2 int1과 int2가 다르면 참
int1 -gt int2 int1이 int2보다 크면 참
int1 -ge int2 int1이 int2보다 크거나 같으면 참
int1 -lt int2 int1이 int2보다 작으면 참
int1 -le int2 int1이 int2보다 작거나 같으면 참
주의) 모두 정수형이다.
파일검사
-r filename 사용자에게 읽기권한이 있을 경우 참
-w filename 사용자에게 쓰기권한이 있을 경우 참
-x filename 사용자에게 실행권한이 있을 경우 참
-f filename filename이 보통파일인 경우 참
-d filename filename이 디렉토리인 경우 참
-c filename filename이 character special 파일인 경우 참
-b filename filename이 block special 파일인 경우 참
-s filename filename의 크기가 0이 아닌 경우참
-t filename 파일 기술자인 fnumb(default 1)와 관련된 장치가 터미널이면 참
조건 테스트
—————–
if command1
then
command2
command3
fi
—————–
if command1
then
command2
command3
else
command4
fi
—————–
if command1
then
command2
command3
elif command4
then
command5
fi
—————–
case value in
pattern1)
command
command;;
pattern2)
command
command;;
…
patternn)
command
command;;
esac
사용자 입력받기
read var1 var2 var3 var4 … varn
반복과 루프제어
—————–
while command
do
command
command
…
command
done
—————–
for variable in arg1 arg2… argn
do
command
command
…
command
done
주의)loop벗어나기 continue, break
함수사용
고급 프로그래밍 언어의 일반적인 특성으로, 컴퓨터 명령어들을 그룹화함으로써 프로그램 내의 어느 곳에서나
호출하여 사용할 수 있게 하는 것이 함수이다. 이러한 함수들을 서브루틴이라고도 한다.
예)
# Start Program
selection(){
while true
do
echo “Continue? (y/n) \c”
read ANSWER
case $ANSWER in
[Yy] ) return 0;;
[Nn] ) return 1;;
* ) echo “Answer y or n”;;
esac
done
}
setup(){
echo “called setup function”
}
if selection
then
setup
echo “Ok”
fi
주의) 먼저 정의하고 사용하라
—————————————————————————————–
쉘과 친해지기
몇가지 예로써 마친다.
예1)@@@@@@@@@@@@@@@@@@@@@@@@@@
# Start Program
selection(){
while true
do
echo “Continue? (y/n) \c”
read ANSWER
case $ANSWER in
[Yy] ) return 0;;
[Nn] ) return 1;;
* ) echo “Answer y or n”;;
esac
done
}
setup(){
echo “called setup function”
}
if selection
then
setup
echo “Ok”
fi
예2)@@@@@@@@@@@@@@@@@@@@@@@@@@
# squares – prints the square of integers in succession
echo “squares – prints the square of integers in succession”
int=1
while [ $int -lt 5 ]
do
sq=`expr $int \* $int`
echo $sq
int=`expr $int + 1`
done
echo “Job Complete”
예3)@@@@@@@@@@@@@@@@@@@@@@@@@@
# Interactive program to testing control statement
echo “음하하..제어문을 전부다 알아보도록하자”
while true
do
# Display Menu
echo
echo “Make a choice from the Menu below”
echo
echo “1 Restore Archive”
echo “2 Backup Archive”
echo “3 Unload Archive”
echo “4 Quit”
echo
#Read the user’s selection
echo “몇벌할라우? : \c”
read CHOICE
case $CHOICE in
[1-3] ) echo
# 디렉토리 경로를 읽어들이고, 디렉토리가 맞는지 체크한다.
echo “어떤 디렉토리를 할라우? \c”
read WORKDIR
if [ ! -d “$WORKDIR” ]
then
echo “디렉토리 입력하라니께”
continue
fi
# 디렉토리 제대로 입력했군. 그쪽으로 가장.
cd $WORKDIR;;
4) : ;;
* ) echo “Sorry, $CHOICE is not a valid choice”
continue
esac
case “$CHOICE” in
1) echo “1번을 선택했군 “;;
2) echo “2번을 선택했군 “;;
3) echo “3번을 선택했군 “;;
4) echo “4번을 선택했군 끝냅니다”
break;;
esac
# 명령이 제대로 실행되었는지 체크한다. 여기서야 당연히 무조건 참이지만..
if [ $? -ne 0 ]
then
echo “프로그램에 문제가 있구만..”
if [ $CHOICE =3 ]
then
echo ” 디렉토리가 지워지지 않는다”
fi
echo “체크해보우”
continue
else
if [ $CHOICE = 3 ]
then
echo “모든 것이 오케이다”
fi
fi
done
예4)@@@@@@@@@@@@@@@@@@@@@@@@@@
#!/bin/bash
# 작성자 : 이상동
# 작성일 : 2002-11-06 10:45오전
# 기 능 : BASE_DIR로 되어있는 전체디렉토리를 백업합니다.
# 생각해볼일 : argument로 변수를 넘겨주어서 임의의 디렉을 백업할 수 있습니다.
# 수정자 :
# 수정이유 :
# 백업할 디렉토리
BASE_DIR=/home
# 저장할 위치
BACKUP_LOCATION=/data/backhome/
LIST=`ls $BASE_DIR|sort -nr`
cd $BASE_DIR
for ACCOUNT in $LIST
do
# 디렉토리가 아닌 경우에는 백업하지 않는다.
# 이번 스크립트는 홈을 백업하는 것이라, 파일은 제거하였다.
# 디렉토리의 모든 내용을 백업할 생각이시면 아래부분을 없애버리시면 됩니다.
if [ ! -d $ACCOUNT ]
then
continue
fi
tar cvfpz ${BACKUP_LOCATION}${ACCOUNT}.tgz $ACCOUNT
done