티스토리 뷰
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 |
'Infrastructure > OS' 카테고리의 다른 글
Red Hat System Administration II: System 성능 튜닝 (0) | 2020.07.21 |
---|---|
Red Hat System Administration II: Job 실행시간 예약 (0) | 2020.07.16 |
Red Hat System Administration I: Linux 파일 시스템 (0) | 2020.06.17 |
Red Hat System Administration I: Redhat 소프트웨어 설치 및 업그레이드 (0) | 2020.06.12 |
Red Hat System Administration I: 압축/해제와 파일 전송 (0) | 2020.06.09 |
- Total
- Today
- Yesterday
- 스포티파이
- 마이크로서비스 패턴
- 요즘남편 없던아빠
- 버라이어티가격
- spotify
- 도파밍
- 디토소비
- 스핀프로젝트
- agile
- 분초사회
- Event Sourcing
- 애자일
- 육각형인간
- SAGA
- 리퀴드폴리탄
- 마이크로서비스
- 돌봄경제
- CQRS
- 호모프롬프트
- API Composition
- micro service
- AXON
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |