[bash] Shell TIPS
원글(이글루): 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