- 사용자 가이드
- Bash 실행 순서
- Bash 인수
- 표준 입출력
- 변수 편집
- Prompt
- 기타 정리
- Bash Script 가이드
- Bash Script 시작 표시
- Bash Script 실행
- Bash Script Arguments
- 종료 코드
- 유용한 Tip
- allowDBConnection
- backupInstance
- Watchdog Tomcat
- 파일 목록 추가
- Disk 용량 확인
- awk
- 파일 편집
- 참고 문헌
Linux에서 많이 사용하는 Shell Script인 bash(Bourne Again Shell)를 정리 한다.
사용자 가이드
Bash 실행 순서
첫 로그인 시
/etc/profile
~/.bash_profile, ~/.bash_login, ~/.profile
Shell 실행시 마다
~/.bashrc
.bashrc 샘플
alias showinfo='~/bin/showinfo.bash'
alias dir='/bin/ls -alF'
alias dird='/bin/ls -alF | grep /'
Bash 인수
$# : 인수의 갯수
$1, $2, $3, ...
shift
for thing in "$@"; do
echo $thing
done
bash -c 실행할_문자열
~ 2> /dev/null : 표준 에러를 표시하지 않음
~ 1>&2 /dev/null : 표준 출력과 표준 에러를 표시하지 않음
${변수=값} : 변수에 값 지정
${HADOOP_HOME:-${HADOOP_PREFIX}} : ${HADOOP_HOME}에 값이 없을 경우 ${HADOOP_PREFIX} 값을 사용
표준 입출력
표준 입력 (/dev/stdin)
<
<<+
Here document.
+
표준 출력 (/dev/stdout)
1>
/dev/null 2>&1
표준 오류 (/dev/stderr)
2> /dev/null
2> /dev/null 1>&2
변수 편집
Replace
${변수명/aaa/bbb} : 첫 aaa를 bbb로 변경
${변수명//aaa/bbb} : 모든 aaa를 bbb로 변경
참고 문헌
Prompt
PS1='\[\e[1;32m\][\u@\h \W]\$\[\e[0m\](0m\.md) '
기타 정리
#!/bin/bash
STR_DATE=`date +%Y%m%d_%H%M%S`
${STR_DATE}
funcShowinfo()
{
~/bin/showinfo_$1.bash
echo '.'
}
funcShowinfo "test"
연월일 표시
#--- CentOS에서
date +%Y%m%d_%H%M%S
kill
ps -C ~ -o pid=
Script Arguments : $1
test ~ = ~
[~ = ~ ]()
echo $?
if [ $# < 5]($.md# < 5.md); then
if [" if " = "centos" ](); then
echo 'rarara'
fi
if ~; then
~
elif ~ ; then
~
else
~
fi
while ~
do
~
done
until ~
do
~
done
case string in
"~") ~
;;
esac
for hostname in "controller001" "controller002" "controller003"; do
echo ${hostname}
done
for ~ in [list](list.md)
do
~
done
for ~
do
~
done
select ~ in [~](~.md)
do
~
done
Bash Script 가이드
Bash Script 시작 표시
#!/usr/bin/env bash
Bash Script 실행
chmod Bash_file
Bash_filesource Bash_file : 스크립트에서 환경 설정한 것이 유지 된다.
. Bash_file : source Bash_file과 동일
Bash Script Arguments
{| cellspacing="0" cellpadding="2" border="1" width="100%" bgcolor="#FFFFFF" align="center"
|-
| width="33%" align="center" valign="middle" style="background-color:#eee;" | Item
| width="70%" align="center" valign="middle" style="background-color:#eee;" | Description
|-
| align="center" valign="middle" | $#
| align="left" valign="middle" | Argument의 개수
|-
| align="center" valign="middle" | $1, $2, $3, ...
| align="left" valign="middle" | Argument
|-
| align="center" valign="middle" | shift
| align="left" valign="middle" | $1을 삭제하고 번호를 하나씩 줄인다.
|}
종료 코드
exit 종료_코드
0 : 정상 종료
1 ~ 255 : 비정상 종료
$? : 직전에 실행된 명령의 종료 코드
유용한 Tip
allowDBConnection
#!/bin/bash
### ================================================================================================
### 프로그램 명 : allowDBConnection, Version 1.0
### 프로그램 설명 : 특정 host에서 Database로의 접속을 허용 합니다.
### 작성자 : 김계현 (pnuskgh@gmail.com, 010-5034-3931)
### 작성일 : 2002.09.27 ~ 2002.09.27
### ----[관리](History)------------------------------------------------------------------------------
### 수정자 :
### 수정일 :
### 수정 내용 :
### ================================================================================================
###--- Command Line에서 입력된 인수를 검사한다.
if [ $# = 4 ]($.md# = 4.md); then
HOST=$1
DATABASE=$2
USER=$3
PASSWORD=$4
elif [ $# = 5 ]($.md# = 5.md); then
HOST=$1
DATABASE=$2
USER=$3
PASSWORD=$4
else
/bin/echo "Using : allowDBConnection HOST DATABASE USER PASSWORD [ROOTPASSWORD](ROOTPASSWORD.md)"
/bin/echo " HOST : 접속하려는 client의 host"
/bin/echo " DATABASE : 접속을 허용하려는 Database"
/bin/echo " USER : Database 사용자"
/bin/echo " PASSWORD : Database 사용자의 암호"
/bin/echo " ROOTPASSWORD : Database의 root 사용자의 암호"
/bin/echo " "
exit
fi
###--- 특정 host에서 Database로의 접속을 허용 합니다.
if [ $# = 4 ]($.md# = 4.md); then
/usr/bin/mysql -uroot -p <<+
connect mysql;
insert into db
values ('${HOST}', '${DATABASE}', '${USER}',
'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',
'Y','Y','Y','Y','Y','Y','Y','Y','Y');
commit;
flush privileges;
grant all privileges on ${DATABASE}.* to ${USER}@${HOST} identified by '${PASSWORD}';
exit
+
else
/usr/bin/mysql --user=root --password=${ROOTPASSWORD} mysql <<+
insert into db
values ('${HOST}', '${DATABASE}', '${USER}',
'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',
'Y','Y','Y','Y','Y','Y','Y','Y','Y');
commit;
flush privileges;
grant all privileges on ${DATABASE}.* to ${USER}@${HOST} identified by '${PASSWORD}';
exit
+
fi
backupInstance
#!/bin/bash
### ================================================================================================
### 프로그램 명 : backupInstance, Version 1.0
### 프로그램 설명 : Sugar Instance와 Database를 백업 합니다.
### 작성자 : 김계현 (pnuskgh@gmail.com, 010-5034-3931)
### 작성일 : 2002.07.15 ~ 2002.09.27
### ----[관리](History)------------------------------------------------------------------------------
### 수정자 :
### 수정일 :
### 수정 내용 :
### ================================================================================================
###--- Default 환경변수를 설정한다.
WEB_ROOT=/var/www/html
BACKUP_DIR=/data/backup
###--- Command Line에서 입력된 인수를 검사한다.
if [ $# = 4 ]($.md# = 4.md); then
INSTANCE=$1
DATABASE=$2
USER=$3
PASSWORD=$4
else
/bin/echo "Using : backupInstance INSTANCE DATABASE USER PASSWORD"
/bin/echo " INSTANCE : Sugar Instance"
/bin/echo " DATABASE : Database"
/bin/echo " USER : Database 사용자"
/bin/echo " PASSWORD : Database 사용자의 암호"
/bin/echo " "
exit
fi
###--- Sugar Instance를 백업 합니다.
cd ${WEB_ROOT}
/bin/tar cvf ${BACKUP_DIR}/${INSTANCE}_`date +%Y%m%d_%H%M%S`.tar ${INSTANCE}
/usr/bin/mysqldump --user=${USER} --password=${PASSWORD} ${DATABASE} > ${BACKUP_DIR}/${DATABASE}_DB_`date +%Y%m%d_%H%M%S`.sql
/bin/tar cvf ${BACKUP_DIR}/${DATABASE}_DB_`date +%Y%m%d_%H%M%S`.tar /var/lib/mysql/${DATABASE}
clear
/bin/echo "--------------------------------------------------"
/bin/echo "Backup folder : " ${BACKUP_DIR}
/bin/echo "Backup datetime : " `date +%Y%m%d_%H%M%S`
/bin/echo " "
/bin/ls -alF ${BACKUP_DIR}
Watchdog Tomcat
Apache Tomcat을 모니터링하고 있다가 죽었을 경우 살려주는 Script
watchdogTomcat.csh
#!/bin/csh
###--- Default 환경변수를 설정한다.
goto theSet
theSetEnd:
###--- 인수의 초기값을 설정한다.
set timeSecond="60" ### Process를 검사할 간격
set flagCheck="false" ### true일 경우 한번만 검사를 한다.
###--- Command Line에서 입력된 인수를 검사한다.
goto theArg
theArgEnd:
###--- Process를 검사한다.
theStart:
###--- Process를 확인한다.
set procPID=`/bin/ps -ef | /bin/grep -v /bin/grep | /bin/grep "${PROC_STR}" | /bin/awk '{print $2}'`
###--- Process가 죽었을 경우 다시 살린다.
if ("${procPID}" == "") then
${PROC_STOP} >& /dev/null
${PROC_START} >& /dev/null
\/bin/echo "----------------------------------------" >> ${JOB_LOG}
\/bin/echo "--- ${PROC_NAME} 재기동" >> ${JOB_LOG}
\/bin/date >> ${JOB_LOG}
\/bin/echo " " >> ${JOB_LOG}
endif
###--- "-check" 인수가 있을 경우 처리를 종료하고, 없을 경우 timeSecond만큼 sleep한후 다시 검사한다.
if ("${flagCheck}" == "true") exit
/bin/sleep ${timeSecond}
goto theStart
theSet:
###--- 환경변수를 설정한다.
set PROC_NAME="Apache Tomcat 서버" ### Process 명
### Process를 확인할 수 있는 문자열
set PROC_STR="Dcatalina.home=/usr/local/tomcat6"
### Process Stop 명령어
set PROC_STOP="service tomcat6 stop"
### Process Start 명령어
set PROC_START="service tomcat6 start"
set JOB_LOG="/root/logs/watchdog.log" ### 현재 프로그램이 처리한 Log 파일
goto theSetEnd
theArg:
if ($#argv < 1) goto theArgEnd
switch ("$argv[1](1.md)")
case "-check":
set flagCheck="true"
shift
breaksw
case "-help":
goto theUsing
case "-time":
shift
if ($#argv < 1) goto theUsing
set timeSecond="$argv[1](1.md)"
shift
breaksw
default:
goto theUsing
breaksw
endsw
goto theArg
theUsing:
\/bin/echo "Using : watchdogTomcat.csh [-help] [-time sec] [-check](-check.md)"
\/bin/echo " -help : 프로그램에 대한 사용법을 보여준다."
\/bin/echo " -time sec : 초 단위로 Process를 검사할 간격을 설정한다. (default. 60)"
\/bin/echo " -check : 한번만 검사를 한다. (crontab에서 사용할 경우를 위해)"
\/bin/echo " "
exit
파일 목록 추가
CLASSPATHA=/nas/appl/flume/lib
for file in /nas/appl/flume/lib/*.jar
do
CLASSPATHA=${CLASSPATHA}:${file}
done
Disk 용량 확인
폴더별 사용 용량 확인
du -s -m *
awk
명령행
awk 'pattern {action}' file
awk -f awkfile file
Pattern
BEGIN //--- 시작전 실행
END //--- 종료후 실행
/정규식/ //--- 정규식을 만족하면 실행
expression //--- 참일 경우 실행 (not zero, not null), &&(and), ||(or) !(not)
pattern1, pattern2 //--- pattern1과 pattern2 사이의 라인에서 실행
Action
print $1, $2
printf(format, ...)
if (~) ~ else ~
var ~pattern : var 변수가 pattern에 일치하면 참
var !~pattern : var 변수가 pattern에 일치하지 않으면 참
while (~) ~
for (~;~;~) ~
for (~ in ~) ~
do ~ while (~)
break, continue
next
exit
exit expression
Variables
FILENAME //--- 파일 이름
FS //--- 입력 필드 분리자
NR //--- 현재 행번호
NF //--- 현재 행의 필드 갯수
OFS //--- 출력되는 필드의 분리자
내장 함수
length(x) //--- 문자의 길이
int(x) //--- x의 정수값
substr(str, start, len) //--- str 문자열에서 start부터 len개의 문자 반환
sub(from, to, str) //--- str 문자열에서 첫번째 from을 to로 치환
gsub(from, to, str) //--- str 문자열에서 모든 from을 to로 치환
split(str, array, sep) //--- str 문자열을 sep 문자열로 구분하여 쪼개어 array에 저장 (array[1](1.md))
toupper(str)
tolower(str)
system(command) //--- 명령을 실행하고 exit 상태를 반환
파일 편집
sed
echo "NOZEROCONF=yes" >> /etc/sysconfig/network #--- 마지막에 문자열 추가 sed -i '/source/i\ new prev content' fileName #--- source 이전줄에 추가 sed -i '/source/c\ new prev content' fileName #--- source 줄을 교체 sed -i '/source/a\ new next content' fileName #--- source 다음줄에 추가 sed -i '/source/r textfile' fileName #--- source 다음줄에 textfile을 읽어서 추가 sed -i 's/source/target/g' fileName #--- 문자열 치환 (Substitute) sed -i 's/hello/& world/g' fileName #--- &는 패턴 매칭된 부분임 sed -i '/source/d' fileName #--- 삭제 (Delete) sed '/source/p' fileName #--- 문자열 출력 (Print) sed -e script sed -f script_file sed -r 정규표현식 find . -type f -print0 | xargs -0 's/source/target/g'
yum -y install crudini
crudini --set [OPTION]... config_file section [param] [value](value.md) crudini --get [OPTION]... config_file [section] [param](param.md) crudini --del [OPTION]... config_file section [param] [value](list) crudini --merge [OPTION]... config_file [section](section.md)
xargs : 앞 명령어의 출력을 뒷 명령어의 인자로 전달
ls -alF | xargs echo ls | xargs -i cp {} ./backup_files ls | xargs -l{} cp {} ./backup_files
참고 문헌
참고 문헌
모니터링
[[Category:Linux|Category:Linux]]
분류: [프로그램 언어](분류_프로그램 언어.md)