상단

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_file

  • source 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)

최종 수정일: 2024-09-30 12:26:18

이전글 :
다음글 :