"Bash"의 두 판 사이의 차이
둘러보기로 가기
검색하러 가기
잔글 |
잔글 |
||
69번째 줄: | 69번째 줄: | ||
*[https://wiki.kldp.org/HOWTO//html/Adv-Bash-Scr-HOWTO/string-manipulation.html https://wiki.kldp.org/HOWTO//html/Adv-Bash-Scr-HOWTO/string-manipulation.html] | *[https://wiki.kldp.org/HOWTO//html/Adv-Bash-Scr-HOWTO/string-manipulation.html https://wiki.kldp.org/HOWTO//html/Adv-Bash-Scr-HOWTO/string-manipulation.html] | ||
+ | |||
+ | === Prompt === | ||
+ | |||
+ | |||
+ | <pre>PS1='\[\e[1;32m\][\u@\h \W]\$\[\e[0m\] '</pre> | ||
+ | |||
=== 기타 정리 === | === 기타 정리 === | ||
145번째 줄: | 151번째 줄: | ||
~ | ~ | ||
done<font face="sans-serif, Arial, Verdana, Trebuchet MS"><span style="white-space: normal;"> | done<font face="sans-serif, Arial, Verdana, Trebuchet MS"><span style="white-space: normal;"> | ||
+ | |||
2017년 3월 21일 (화) 15:41 판
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 상태를 반환
- 참고 문헌
참고 문헌
- 모니터링