전자책 출간 알림 [마이크로서비스패턴 쉽게 개발하기]

티스토리 뷰

CLI(Command Line Interface)과 Shell파일내에서 반복문, 조건문, 재귀식(Regular expression)을 사용하는 방법에 대해 설명합니다.

간단한 Shell script 만들기

shell script이 제일 처음엔 사용할 shell의 종류를 정의합니다.

#!/bin/bash

아래는 shell 예제입니다.

#!/bin/bash

echo "Hello world"

 

반복문 사용하기

반복문의 형식은 for ...; do ...; done입니다.

아래 예제는 반복문을 통해 각 서버의 정보를 출력하는 예제입니다.

shell 파일로 만들면 아래와 같습니다. shell에서는 세미콜론 대신 new line을 사용합니다.

#!/bin/bash

for HOST in servera serverb
do
  ssh ${HOST} "hostnamectl"
  echo "================="
done
exit 0

프로세스를 정상적으로 종료시키기 위해 맨 마지막에 exit 0를 사용합니다.

 

직전 수행결과코드 얻기

직전 명령의 수행결과 코드를 얻으려면 '$?'를 사용하십시오.

아래 예제와 같이 직전 명령이 성공인 경우 0을 실패한 경우 1을 리턴합니다.

❯ mkdir ~/temp

~
❯ echo $?
0

~
❯ mkdir ~/temp
mkdir: /Users/happycloudpak/temp: File exists

~
❯ echo $?
1

 

조건문 사용하기

조건문 문법

if ... 문

if <CONDITION>; then
      <STATEMENT>
...
      <STATEMENT>
fi

if ... else 문

if <CONDITION>; then
      <STATEMENT>
...
      <STATEMENT>
else
      <STATEMENT>
      ...
      <STATEMENT>
fi

중첩된 조건문

if <CONDITION>; then
      <STATEMENT>
...
      <STATEMENT>
elif <CONDITION>; then
      <STATEMENT>
      ...
      <STATEMENT>
else
      <STATEMENT>
      ...
      <STATEMENT>
fi

 

논리 연산자

논리 연사자는 -gt, -ge, -eq, -nq, -le, -lt이 있습니다. -eq는 '=='으로, '-nq'는 '!='으로 대체할 수 있습니다.

 

조건문 예시

논리연산자를 사용한 조건문의 예시이며,  command line사용시와 shell script 사용시로 나누어 예시하였습니다.

❯ if [ 3 -gt 1 ]; then echo "OK";fi
OK
#!/bin/bash
if [ 3 -gt 1 ]; then
  echo "OK"
fi
exit 0

 

❯ if [ 3 -gt 1 ]; then echo "OK"; else echo "NK"; fi
OK

~
❯ if [ 3 -lt 1 ]; then echo "OK"; else echo "NK"; fi
NK
#!/bin/bash
if [ 3 -lt 1 ]; then
  echo "OK"
else
  echo "NK"
fi
exit 0

 

> num=10;if [ ${num} -lt 5 ]; then echo "It's under 5"; elif [ ${num} -gt 5 ]; then echo "It's over 5"; else echo "It's Unknown"; fi
It's over 5
#!/bin/bash

num=10
if [ ${num} -lt 5 ]; then
  echo "It's under 5"
elif [ ${num} -gt 5 ]; then
  echo "It's over 5"
else
  echo "It's Unknown"
fi
exit 0

 

shell script sample: fixtz

아래 예제는 timezone을 변경하는 fixtz라는 shell script입니다.

parameter 처리 방법과 논리 연산자 사용법을 참고하시기 바랍니다.

#!/bin/bash

# show help
if [ $# -eq 1 ] && [ "$1" == "-h" -o "$1" == "--help" ]; then
	echo "fixtz [-c] [timezone]"
	echo "  -c : clear tz.log"
	echo "  timezone: use 'timedatectl list-timezones' to get the name of timezone"
	echo "  * If you omit timezone, The timezone will be 'Asia/Seoul'"
	exit 2
fi

# set timezone variable
if [ $# -eq 1 ] && [ "$1" != "-c" ]; then #ex) fixtz Asia/Seoul
	TZ=$1
elif [ $# -eq 2 ] && [ "$1" == "-c" ]; then # ex) fixtz -c Asia/Seoul
	TZ=$2
else
	TZ="Asia/Seoul"
fi

CHK=$(timedatectl | grep "${TZ}")

if [ $? -eq 0 ]; then
  msg="Timezone is alreday ${TZ}"
else
  timedatectl set-timezone "${TZ}"
  msg="Timezone is changed to ${TZ}"
fi
echo "${msg}"

# clear log if run with '-c' parameter
if [ $# -ge 1 ] && [ "$1" == "-c" ]; then
	echo "$(date): ${msg}" > tz.log
else
	echo "$(date): ${msg}" >> tz.log
fi

exit 0

 

재귀식 사용하기

재귀식(Reqular expression)을 사용하면 좀 더 편하게 원하는 문자열 값을 구할 수 있습니다.

자주 사용하는 재귀식은 아래와 같습니다.  재귀식은 작은 따옴표로 감싸는것이 좋습니다.

예제를 테스트하기 위해 단어사전을 먼저 설치하십시오.

yum install -y words

쉽게 사용하기 위해 symbolic link를 만듭니다. 
ln -s /usr/share/dict/words ./words

grep cat words
옵션 설명 예시
옵션없음   # grep 'clouds' words
beclouds
clouds
cloudscape
cloudship
overclouds
thunderclouds
unclouds
^ 지정한 패턴으로 시작하여야 함 # grep '^clouds' words
clouds
cloudscape
cloudship
$ 지정한 패턴으로 끝나야 함 # grep 'clouds$' words
beclouds
clouds
overclouds
thunderclouds
unclouds

정확한 문자열 검색을 하려면 아래와 같이 ^와 $를 같이 사용하면 됨
# grep '^clouds$' words
clouds
. Any ONE Character [root@bastion ~]# grep '^pret.y$' words
pretry
pretty
[root@bastion ~]# grep '^pret..$' words
pretan
pretax
preter
pretil
pretor
pretry
pretty
* 와 + *은 바로 앞의 문자가 없거나 1번 이상 일치될 수 있다는 것이고, +는 바로 앞의 문자가 1번 이상 일치될 수 있다는 것임 cloud는 's'가 없는 단어이고, clouds는 's'가 1번 일치되는 단어임.
# grep '^clouds*$' words
cloud
clouds

따라서 아래와 같이 '+'로 바꾸면 clouds만 나옴(+앞에 역슬래쉬 반드시 필요)
# grep '^clouds\+$' words
clouds
{n}, {n, }, {n, m}, {, m} 바로 앞의 문자가 일치하는 횟수를 지정
n번 일치, n번 이상 일치, n번에서 m번 일치, m번 이하 일치
# grep '^pret\{2\}y$' words
pretty
[:alpha:], [:digit:], [:apnum:] '['와 ']'사이에 문자, 숫자, 문자범위, 숫자범위를 지정하여 원하는 문자열을 구함
예) [a-zA-Z], [0-9A-Za-z]
# grep '^clouds.' words
cloudscape
cloudship
# grep '^clouds[c]' words
cloudscape
# grep '^clouds[c-h]' words
cloudscape
cloudship
# grep '^clouds[a-z]' words
cloudscape
cloudship
[^alpha] 해당 문자를 포함하지 않는 문자열을 구함 # grep '^pret.y' words
prethyroid
pretry
pretrying
pretty
pretty-behaved
pretty-by-night
pretty-face
...

대시를 포함하는 단어는 제거합니다.
# grep '^pret.y[^-]' words
prethyroid
pretrying
prettyface
prettying
prettyish
prettyism

그외 옵션들입니다.

 

grep 옵션

grep에 자주 사용하는 옵션은 아래와 같습니다.

옵션 설명 예시
-i 대소문자 구별없이 찾음 ❯ cat cond1
#!/bin/bash
if [ 3 -gt 1 ]; then
  echo "OK"
fi
exit 0

~/work/bin
❯ grep -i ok ./cond1
  echo "OK"

~/work/bin
❯ grep  ok ./cond1

-e, -E 여러개의 패턴을 지정할 때 사용. either의 약자.
-E 옵션이 좀 더 간결함
❯ grep -e 'OK' -e 'ok' ./cond1
  echo "OK"

~/work/bin
❯ grep -E 'OK|ok' ./cond1
  echo "OK"
-v 패턴에 일치하는 라인을 제외하고 찾음 아래는 주석과 빈 라인을 제거한 결과임
cat test
# this is test

HOST=host1
PORT=80
#remove below line before deploy
#PORT=8080

~/work/bin
❯ grep -vE '^#|^$' ./test
HOST=host1
PORT=80
     
댓글

전자책 출간 알림 [마이크로서비스패턴 쉽게 개발하기]