몇 달 전 프로젝트에서 젠킨스를 사용해 자동배포를 한 적이 있다. 빌드를 할 때마다 Spring 프로세스가 실행중인지 확인하고 실행중이면 삭제하는 간단한 쉘 스크립트를 작성했다. 그 때 찾아본걸 정리하는 글이다.
유닉스 계열 OS에서 사용하는 Shell이나 command line 인터프리터에서 구동되도록 작성된 스크립트이다. 즉, 유닉스에서 사용되는 여러 명령어를 나열해 실행하는 것이다. .sh파일로 생성된다.
공백이 없게
작성한다.$var or ${var}
를 사용한다. 단, 변수에 변수를 할당할 때는 $를 사용하지 않는다.readonly
를 사용한다. (Java의 final..?)unset
을 사용하면 변수를 삭제할 수 있다.(readonly 설정된 변수는 불가)#!/bin/sh
var="안녕"
var2 = "반가워"
readonly var2
echo ${var}
var=var2
echo ${var}
변수 | 기능 |
---|---|
$0 | 실행된 스크립트 파일명 |
$1~9 | 스크립트 실행될 때 전달된 인수 접근 |
$# | 스크립트에 전달된 인수의 수 |
$* / $@ | 스크립트에 전달된 모든 인수 |
$$ | 실행된 쉘 스크립트의 PID |
$! | 마지막에 실행된 백그라운드 PID |
$? | 직전에 실행한 명령어 종료 값 (0 = 성공, 1 = 실패) |
shell script의 산술연산은 expr
함수를 이용해야 한다.
연산자 | 기능 | 예 |
---|---|---|
+ | 덧셈 | expr 1 + 1 |
+ | 뺄셈 | expr 1 - 1 |
* | 곱셈 | expr 2 * 3 |
/ | 나눗셈 | expr 4 / 2 |
% | 나머지 | expr 5 % 2 |
= | 할당 | a=b |
== | 같음 | [ "$var1" == "$var2" ] |
!= | 다름 | [ "$var1" != "$var2" ] |
연산자 | 기능 | 예 |
---|---|---|
-eq | == | ["$var1" -eq "var2"] |
-ne | != | ["$var1" -ne "var2"] |
-gt | > | ["$var1" -gt "var2"] |
-lt | < | ["$var1" -lt "var2"] |
-ge | >= | ["$var1" -ge "var2"] |
-le | <= | ["$var1" -le "var2"] |
! | not | [! "$var1" -eq "var2"] |
-o | or | ["$var1" -eq "var2" -o "var2" -eq "var3"] |
-a | and | ["$var1" -eq "var2" -a "var2" -eq "var3"] |
-z | String is Empty | [-z"$var1"] |
-n | String is not Empty | [-n "var1"] |
if[조건] then [커맨드] fi
이다.if["var1" -eq "var2"]
then
echo "첫번째 조건 만족"
elif["var1" -gt "var2"]
then
echo "두번째 조건 만족"
else
echo "위 두조건 모두 만족하지 않음"
switch case 변수 in 조건 값) 커맨드 ;; esac
var1="변수"
case "$var1" in
"상수") echo "상수" ;;
"변수") echo "변수" ;;
esac
for문
for var in {0..5}
do
echo $var
done
while문
while 조건을 만족하는 동안 반복
var=0
while [$a -lt 5]
do
echo $var
var=`expr $var + 1`
done
until문
while문과 반대, 조건을 만족할 때까지 반복 즉, 조건이 만족하지 않는동안 반복
var=0
while [! $a -lt 5]
do
echo $var
var=`expr $var + 1`
done
#함수 선언
Function(){
echo "함수 실행"
}
ParamFunction(){
echo "param1: $1 param2: $2"
}
#함수 실행
Function
ParamFunction
유닉스계열 명령어와 쉘스크립트 문법을 섞어 아래와 같은 스크립트 작성이 가능하다.
#spring PID를 변수에 할당
#리눅스 파이프를 이용해 spring PID를 찾음
# ps -ef | grep java | grep spring-project-name | awk '{print $2}' ->
# 프로세스 목록 출력 결과중 java를 찾고 그 중 spring-project-name을 찾고
# awk명령어를 이용해 pid를 찾아낸다.
# awk는 레코드 중 특정 필드값을 찾는 것
CURRENT_PID=$(ps -ef | grep java | grep spring-project-name | awk '{print $2}')
echo "$CURRENT_PID"
#만약 CURRENT_PID에 할당된 값이 없으면 -> 실행중인 Spring프로젝트가 없다
if [ -z $CURRENT_PID ]
then echo "> there doesn't exist pid ."
#만약 할당된 값이 있으면 -> 실행중인 Spring프로젝트가 있다.
else echo "> kill -9 $CURRENT_PID"
#spring프로세스의 ID로 kill
kill -9 $CURRENT_PID
echo current jar process killed forcefully, process id $CURRENT_PID.
fi
https://engineer-mole.tistory.com/200
https://blog.d0ngd0nge.xyz/shell-script/
https://reakwon.tistory.com/163