[Shell Script] 조건문, 반복문, 연산자, 정규표현식

Jade·2021년 3월 14일
0

조건문 IF, switch-case

if문

  • if문은 질문을 통해 질문에 대한 답이 참인지 거짓인지를 판단하여 그 다음 행동에 영향을 준다.

기본 사용법

if [ 첫 번째 조건식 ]
then
    수행문
elif [ 두 번째 조건식 ]
then
    수행문
else
    수행문
fi
  • if, then, else, fi는 반드시 기입해야 한다.
  • 대괄호[]와 조건식 사이에는 반드시 한 칸의 스페이스를 두어야 한다.

조건식 타입

  • if [ $변수 연산자 $변수 ]; then
    • 일반적인 조건식 타입으로 두 변수의 값을 비교할 때 쓰임
    • 예제: 변수 value1과 value2 값이 동일한지 비교하는 조건문
    • 두 변수의 값은 동일하므로 True가 출력되는 것을 확인할 수 있다.
    • 세미콜론(;)은 문법이나 명령어 또는 구문이 완료되어 다음 줄로 넘길 경우에 사용한다. 예제에서는 [ $변수 연산자 $변수 ] 다음에 바로 then이 오는 것이 아니라 다음 줄에 왔기 때문에 사용되지 않는다.
  • if [ $변수 연산자 조건값 ]; then
    • 조건값이 고정되어 있을 경우 변수와 조건값을 비교할 때 사용
    • 예제: 변수 value의 값이 0인지 비교하는 조건문
    • value의 값이 0이므로 True를 출력한다.
  • if [ 연산자 $변수 ]; then
    • 변수의 값이 문자열이거나 디렉터리와 같은 경우일 때 주로 사용
    • 예제: 변수 value의 길이가 0인지 비교하는 조건문
    • 연산자 -z는 변수에 저장된 값의 길이가 0인지를 비교하여 0이라면 True를, 아니라면 False를 리턴하는 문자열 연산자.
    • 변수 value의 길이가 0이므로 True가 출력되었다.
  • if [ 조건식 ] 연산자 [ 조건식 ]; then
    • 여러 개의 조건식을 AND나 OR로 복합 연산할 때 사용
    • 예제: 변수 value의 값은 0보다 크고, 10보다 작은지를 비교하는 조건문
    • 연산자 -gt는 A가 B보다 큰지 비교하는 연산자
    • 연산자 -lt는 A가 B보다 작은지 비교하는 연산자
    • &&는 AND 연산
    • value값은 0보다 크고, 10보다 작으므로 True가 출력된다.

switch-case문

  • 변수의 값에 따라 분기를 해야 하는 경우에 주로 사용된다.
  • switch-case문은 셸마다 기본 사용법의 차이가 있으므로, 여기서는 BASH 셸 기준의 사용법을 학습한다.

기본 사용법

case $변수 in
    조건값1)
    수행문1 ;;
    조건값2)
    수행문2 ;;
    조건값3)
    수행문3 ;;
    *)
    수행문4
esac
  • 예제: 입력받은 파라미터에 따라 해당 문자열을 출력하기
  • 입력 받은 매개변수와 조건값이 일치하므로 Start, Help 정상 출력
  • 입력 받는 매개변수가 없는 경우 Please input sub command 출력

반복문 for, while

for문

  • 리스트나 배열과 같이 다수의 값을 이용하여 동일한 작업을 처리할 경우 주로 사용

기본 사용법1 - Python 문법과 유사(주로 사용)

for 변수 in [ 범위(리스트 또는 배열, 묶음 등) ]
do
    반복할 수행문
done
  • 예제: 반복하고자 하는 값을 나열하기
  • 예제2: 위 예제와 달리 반복할 값의 범위를 변수에 저장함으로써 변수 값만 바꾸면 언제든지 범위 값을 변경할 수 있게 하기
  • 예제3) 홈 디렉터리를 나타내는 환경변수를 사용하여 홈 디렉터리 내의 디렉터리 및 파일 목록을 범위로 사용하기
  • 예제4) 중괄호{}를 사용하여 반복문의 범위 값을 모두 나열하지 않고 생략하기
  • 예제4-1) 증가값이 1이 아닌 경우 - 1부터 10사이 홀수 값 출력
  • 예제5) 범위를 배열로 사용할 경우
    주의: 배열 선언시 값과 값 사이의 쉼표,를 사용하면 안되며, for문 배열의 모든 아이템을 범위로 사용할 경우 ${배열[@]}을 사용하여 배열의 모든 아이템을 사용한다고 명시해야 한다.

기본 사용법2 - C, Java 문법과 유사

for ((변수=초기값; 조건식; 증가값))
do
    반복할 수행문
done
  • 예제: 0부터 1씩 증가하여 3보다 작을때까지 숫자 출력하기

while문

  • 특정 범위를 사용하는 것이 아니라 변수의 값이 특정 조건에 맞을 때까지 계속 반복하는 경우 사용

기본 사용법

while [ $변수1 연산자 $변수2 ]
do
    반복할 수행문
done
  • 예제: 변수 num 값이 3보다 작을 때까지 num 값 출력
    주의: while문을 사용할 경우, 변수가 조건에 맞도록 증가식(e.g. num=$((num+1)))을 꼭 넣어줘야 한다. 그렇지 않을 경우 무한 루프에 빠질 수 있다.

연산자

  • 쉘 스크립트의 대부분에 문법에서 조건식을 만들기 위해 사용한다.

문자열 연산자

  • 변수의 데이터 타입이 문자열인 경우 주로 사용되는 연산자
  • 해당 연산자와 함께 사용하면 변수에 숫자든, 파일명이나 디렉터리와 같은 객체형 값이 저장되든 상관없이 모두 문자열로 취급한다.
  • 문자열 연산자에는 문자열 길이를 체크하는 연산자가 있다.
    • -z: 문자열 길이가 0이면 True
    • -n: 문자열 길이가 0이 아니면 True
  • 예제1) 파라미터로 받은 변수 값의 길이가 0이면 True, 아니면 False
  • 예제2) 파라미터로 받은 변수 값의 길이가 0이면 False, 아니면 True
    ** 책 속 예제와 달리 변수를 쌍따옴표""로 감싸야 정상 작동한다. 아닐 경우 파라미터가 있든, 없든 True가 출력되었다.

비교 연산자

  • 두 개의 변수에 저장된 값의 크기를 비교할 때 사용한다.

정수 비교 연산자

  • -eq: 변수1과 변수2의 값이 같으면 참(=, equals)
    • 예제) 변수값이 서로 같은지 체크하기
  • -ne: 변수1과 변수2의 값이 다르면 참(!=, not equal to)
    • 예제) 변수값이 서로 다른지 체크하기
  • -gt: 변수1의 값이 변수2의 값보다 크면 참(greater than)
  • -ge: 변수1의 값이 변수2의 값보다 크거나 같으면 참(greater than or equal to)
  • -lt: 변수1의 값이 변수2의 값보다 작으면 참(less than)
  • -le: 변수1의 값이 변수2의 값보다 작거나 같으면 참(less than or equal to)
  • 아래 기호를 사용할 경우, 리다이렉션 기호와 구별하기 위해 반드시 중첩소괄호(())를 사용해야 한다.

    • >: 변수1의 값이 변수2의 값보다 크면 참
    • >=: 변수1의 값이 변수2의 값보다 크거나 같으면 참
    • <: 변수1의 값이 변수2의 값보다 작으면 참
    • <=: 변수1의 값이 변수2의 값보다 작거나 같으면 참

문자열 비교 연산자

  • 변수의 값이 문자열일 경우, 기호 연산자를 사용한다. 단 리다이렉션 기호와 동일한 <> 기호를 사용할 경우에는 구분을 위해 중첩 대괄호[[]]를 사용한다.
    • =: 각 변수의 값이 같으면 참, 동일한 문자열일 경우 참
    • ==: 각 변수의 값이 같으면 참, 동일한 문자열일 경우 참
    • !=: 각 변수의 값이 다르면 참, 서로 다른 문자열일 경우 참
    • >: 변수1의 ASCII 코드값이 변수2보다 크면 참
    • <: 변수1의 ASCII 코드값이 변수2보다 작으면 참

논리 연산자

  • -a: AND 연산. 조건식 1도 참이고, 조건식 2도 참이면 참. 조건식은 논리 연산자를 제외한 다른 연산자를 사용하는 경우를 말함
    • 예제) VAR1가 VAR2보다 작고, VAR2가 VAR3보다 크면 참
  • -o: OR 연산. 조건식 1이 참이거나 조건식 2가 참이면 참
    • 예제) VAR1가 VAR2보다 작거나, VAR2가 VAR3보다 크면 참
  • 아래 기호를 쓸 경우, 조건식 별로 대괄호[]를 사용하거나 중첩 대괄호[[]]를 사용해야 한다.
    • &&: AND 연산
    • ||: OR 연산

디렉터리 연산자

변수 유형이 디렉터리일 경우 사용할 수 있는 연산자

  • -d: 변수 유형이 디렉터리면 참
  • -e: 변수 유형이 디렉터리이거나 파일이면 참

파일 연산자

파일이 가지고 있는 다양한 속성들을 체크하는 연산자

  • -f: 변수 유형이 파일이면 참
  • -L: 변수 유형이 파일이면서 심볼릭 링크이면 참
  • -r: 변수 유형이 파일이거나 디렉터리이면서 읽기 권한이 있으면 참
  • -w: 변수 유형이 파일이거나 디렉터리이면서 쓰기 권한이 있으면 참
  • -x: 변수 유형이 파일이거나 디렉터리이면서 실행 권한이 있으면 참
  • -s: 변수 유형이 파일이거나 디렉터리이면서 사이즈가 0보다 크면 참
  • -O: 변수 유형이 파일이거나 디렉터리이면서 스크립트 실행 소유자와 동일하면 참
  • -G: 변수 유형이 파일이거나 디렉터리이면서 스크립트 실행 그룹과 동일하면 참

파일 비교 연산자

두 개의 변수에 정의된 파일을 비교하는 연산자

  • -nt: 변수 유형이 파일이면서, 변수1이 변수2보다 최신 파일이면 참
  • -ot: 변수 유형이 파일이면서, 변수1이 변수2보다 이전 파일이면 참
  • -ef: 변수 유형이 파일이면서, 변수1과 변수2가 동일 파일이면 참

정규표현식

  • 리눅스나 유닉스에 특별한 특징을 부여하는 문자들과 메타 문자들의 집합
  • 주로 텍스트 탐색과 문자열 조직에 쓰이며, 하나의 문자와 일치하거나 혹은 문자열의 일부분이나 전체 문자열 중 특정 문자 집합을 표현할 때 사용

POSIX 기본 및 확장 문법

패턴을 기술하기 위한 다양한 메타 문자들

  • .: 뉴라인을 제외한 한 개의 문자와 일치함
  • ?: 자신 앞에 나오는 정규 표현식이 없거나 하나가 일치하며, 대부분 한 개의 문자와 매칭할 때 사용함
  • *: 바로 앞 문자열이나 정규 표현식에서 한번 이상 반복되는 문자
  • +: 자신 앞에 나오는 하나 이상의 정규 표현식과 일치함. *과 비슷하게 동작하지만 반드시 하나 이상일 경우에만 일치함.
  • {N}: 정확히 N번 일치함
  • {N,M}: N번 또는 그 이상 일치함
  • -: A부터 Z를 A-Z로 표현하듯, 알파벳이나 숫자의 범위를 나타낼 때 사용
  • ^: 라인의 시작에서 공백 문자열을 의미함. 또한 목록의 범위에 없는 문자들을 의미함
  • $: 라인 마지막에서 공백 문자열을 의미함
  • ^$: 빈 줄과 일치함
  • [...]: 대괄호는 단일 정규 표현식에서 문자들을 집합으로 묶어줌
  • \: 특수 문자를 원래의 문자 의미대로 해석함
  • \b: 단어 끝의 공백 문자열을 의미함
  • \B: 라인 끝의 공백 문자열을 의미함
  • \<: 단어 시작에서 공백 문자열을 의미함
  • \>: 라인 끝에서 공백 문자열을 의미

POSIX 문자 클래스

찾고자 하는 문자열의 종류

  • [:alnum:]: 알파벳이나 숫자로 이루어진 문자열. [A-Za-z0-9]와 같은 표현임
  • [:alpha:]: 알파벳 문자를 의미하며 [A-Za-z]와 같은 표현임
  • [:blank:]: 스페이스나 탭을 의미함
  • [:cntrl:]: 제어 문자들을 의미함
  • [:digit:]: 0~9 사이의 숫자를 의미함 [0-9]와 같은 표현임
  • [:graph:]: 출력 가능한 그래픽 문자들로 ASCII 33~126 사이의 문자들과 일치함. 스페이스 및 제어 문자들을 제외한 [:print:]와 같음
  • [:print:]: 출력 가능한 그래픽 문자들로 ASCII 32~126 사이의 문자들과 일치함. [:graph:]와 비슷하지만 스페이스 문자를 포함
  • [:punct:]: 문장 부호 문자들을 의미함
  • [:space:]: 뉴라인 줄바꿈, 스페이스, 탭과 같은 모든 공백 문자들을 의미함
  • [:upper:]: 알파벳 대문자를 의미하며 [A-Z]와 같은 표현임
  • [:lower:]: 알파벳 소문자를 의미하며 [a-z]와 같은 표현임
  • [:xdgit:]: 16진수의 숫자와 문자를 의미하며 [0-9a-fA-F]와 같은 표현임

📌 장현정 지음, 『처음 배우는 셸 스크립트』, 한빛미디어(2021)

profile
우당탕탕 좌충우돌 인프라 여행기

0개의 댓글