Bash

오픈소스 비즈니스 컨설팅
둘러보기로 가기 검색하러 가기

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\] '


기타 정리

#!/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; then

if [ "$1" = "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]
do
~
done
for ~
do
~
done
select ~ in [~]
do
~
done




Bash Script 가이드

Bash Script 시작 표시

#!/usr/bin/env bash


Bash Script 실행

  • chmod Bash_file
    Bash_file
  • source Bash_file : 스크립트에서 환경 설정한 것이 유지 된다.
  • . Bash_file : source Bash_file과 동일


Bash Script Arguments

Item Description
$# Argument의 개수
$1, $2, $3, ... Argument
shift $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 ; then
HOST=$1
DATABASE=$2
USER=$3
PASSWORD=$4
elif  $# = 5 ; then
HOST=$1
DATABASE=$2
USER=$3
PASSWORD=$4
else
/bin/echo "Using : allowDBConnection HOST DATABASE USER PASSWORD [ROOTPASSWORD]"
/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 ; 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 ; 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]")
  case    "-check":
      set     flagCheck="true"
      shift
      breaksw
  case    "-help":
      goto    theUsing
  case    "-time":
      shift
      if ($#argv < 1)   goto    theUsing
      set     timeSecond="$argv[1]"
      shift
      breaksw
  default:
      goto    theUsing
      breaksw
endsw

goto    theArg

theUsing:
\/bin/echo   "Using : watchdogTomcat.csh [-help] [-time sec] [-check]"
\/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])
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]
crudini --get [OPTION]...   config_file [section] [param]
crudini --del [OPTION]...   config_file section   [param] [list value]
crudini --merge [OPTION]... config_file [section]


xargs : 앞 명령어의 출력을 뒷 명령어의 인자로 전달

ls -alF | xargs echo
ls | xargs -i cp {} ./backup_files
​ls | xargs -l{} cp {} ./backup_files


참고 문헌

참고 문헌

  • 모니터링