Shell Script

가수왕·2022년 12월 12일
0

linux에서

목록 보기
3/3

0. 개요

몇 달 전 프로젝트에서 젠킨스를 사용해 자동배포를 한 적이 있다. 빌드를 할 때마다 Spring 프로세스가 실행중인지 확인하고 실행중이면 삭제하는 간단한 쉘 스크립트를 작성했다. 그 때 찾아본걸 정리하는 글이다.

1. Shell Script

유닉스 계열 OS에서 사용하는 Shell이나 command line 인터프리터에서 구동되도록 작성된 스크립트이다. 즉, 유닉스에서 사용되는 여러 명령어를 나열해 실행하는 것이다. .sh파일로 생성된다.

2. 변수 선언

  • 변수 이름은 알파벳 + 숫자 + 언더바를 사용할 수 있다. 단, 숫자로 시작할 수 없다
  • 변수에 값을 할당할 때는 =연산자 앞 뒤로 공백이 없게 작성한다.
  • 변수를 사용할 때는 $var or ${var}를 사용한다. 단, 변수에 변수를 할당할 때는 $를 사용하지 않는다.
  • 변수를 선언하고, 수정을 불가능하게 하려면 readonly를 사용한다. (Java의 final..?)
  • unset을 사용하면 변수를 삭제할 수 있다.(readonly 설정된 변수는 불가)
#!/bin/sh
var="안녕"
var2 = "반가워"
readonly var2
echo ${var}
var=var2
echo ${var}

3. 환경변수

변수기능
$0실행된 스크립트 파일명
$1~9스크립트 실행될 때 전달된 인수 접근
$#스크립트에 전달된 인수의 수
$* / $@스크립트에 전달된 모든 인수
$$실행된 쉘 스크립트의 PID
$!마지막에 실행된 백그라운드 PID
$?직전에 실행한 명령어 종료 값 (0 = 성공, 1 = 실패)

4. 오퍼레이터

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"]
-oor["$var1" -eq "var2" -o "var2" -eq "var3"]
-aand["$var1" -eq "var2" -a "var2" -eq "var3"]
-zString is Empty[-z"$var1"]
-nString is not Empty[-n "var1"]

5. 조건문(IF)

  • shell script의 if문의 포맷은 if[조건] then [커맨드] fi이다.
  • elif, else도 사용이 가능하다.
if["var1" -eq "var2"]
then
	echo "첫번째 조건 만족"
elif["var1" -gt "var2"]
then
	echo "두번째 조건 만족"
else
	echo "위 두조건 모두 만족하지 않음"

6. 조건문(SWITCH)

  • switch의 기본 포맷은 switch case 변수 in 조건 값) 커맨드 ;; esac
var1="변수"
case "$var1" in
	"상수") echo "상수" ;;
    "변수") echo "변수" ;;
esac

7. 반복문

  • 반복문은 while, for 문이 있다. 특이하게 until문도 있다.

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

7. 함수

#함수 선언
Function(){
	echo "함수 실행"
}

ParamFunction(){
	echo "param1: $1 param2: $2"
}
#함수 실행
Function
ParamFunction

8. 활용 예

유닉스계열 명령어와 쉘스크립트 문법을 섞어 아래와 같은 스크립트 작성이 가능하다.

#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

9. 참고

https://engineer-mole.tistory.com/200
https://blog.d0ngd0nge.xyz/shell-script/
https://reakwon.tistory.com/163

0개의 댓글