ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Shell Script - 2. for, if문
    공부합시다!/LInux 2023. 2. 10. 00:15
    728x90

    계속해서 Linux Script에서 사용하는 반복문(for)과 조건문(if)에 대해서 공부하도록 하겠습니다.

     

    1. for

    2. if

    순서로 진행합니다.

     

    1. for 문

     1.1. 정의

      1.1.1  하나의 타겟에 하나의 명령을 여러 번 실행.

      1.1.2. 많은 데이터베이스를 백업하는 것과 같이 여러 타겟에 하나의 명령을 각각 한 번씩 실행   

      1.1.3. for 반복문은 작업 반복에 사용할 Bash 반복 구문

     1.2. 구문

    for VARIABLE in LIST; do
    COMMAND VARIABLE
    done

      1.2.1. 위의 반복문은 LIST에 제공하는 문자열을 처리하고 목록의 마지막 문자열을 처리한 후에 종료. 

      1.2.2. 각 목록 문자열을 VARIABLE이라는 값으로 임시로 저장한 다음 해당 변수를 사용하는 명령 블록을 실행.

      1.2.3. 변수 이름은 임의적이며 일반적으로 변수 값은 명령 블록의 명령으로 참조.

      1.2.4. 사용자가 직접 입력하거나 쉘 확장(예: 변수, 중괄호, 파일 이름 확장)이나 명령 대체로 인해 생성된 목록의 for 반목문의 경우 문자열 목록을 제공.

     1.3. 예제

    [root@localhost ~]# for USER in a b c; do echo $USER; done
    a
    b
    c
    [root@localhost ~]# for USER in {a,b,c}; do echo $USER; done
    a
    b
    c
    [root@localhost ~]# for USER in {a..c}; do echo $USER; done
    a
    b
    c
    [root@localhost ~]# for TEST in $(seq 1 3 20); do echo "$TEST"; done
    1
    4
    7
    10
    13
    16
    19
    [root@localhost ~]# for PACKAGE in $(rpm -qa | grep kernel); \
    > do echo "$PACKAGE was installed on \
    > $(date -d @$(rpm -q --qf "%{INSTALLTIME}\n" $PACKAGE))"; done
    kernel-tools-libs-3.10.0-1160.el7.x86_64 was installed on 2023. 02. 07. (화) 06:19:31 KST
    kernel-3.10.0-1160.el7.x86_64 was installed on 2023. 02. 07. (화) 06:19:59 KST
    kernel-tools-3.10.0-1160.el7.x86_64 was installed on 2023. 02. 07. (화) 06:20:04 KST

     

     1.4. Script 종료 코드

      1.4.1. 스크립트에서 모든 콘텐츠를 해석하고 처리한 후에는 스크립트 프로세스가 종료.

      1.4.2. 해당 프로세스를 호출한 상위 프로세스로 제어가 다시 전달.

      1.4.3. 스크립트에 오류 조건이 발생하는 경우와 같이 스크립트가 완료되기 전에 스크립트를 종료 가능.

      1.4.4. 스크립트를 즉시 종료하고 나머지 스크립트의 처리를 건너뛰려면 exit 명령을 사용.

      1.4.5. exit 명령은 종료 코드를 나타내는 0과 255 사이의 선택적 정수 인수와 함께 사용.

      1.4.6. 종료 코드 값 0은 스크립트가 오류 없이 완료, 0이 아닌 다른 모든 값은 오류 종료 코드를 나타냄.

      1.4.7. 기본 제공 $? 변수에서 마지막으로 완료된 명령의 종료 코드를 검색.

    [root@localhost ~]# vi endcode
    	  1 #!/bin/bash
          2 echo "Hello, Linux"
          3 exit 0
    :wq
    [root@localhost ~]# chmod u+x endcode 
    [root@localhost ~]# ./endcode
    Hello, Linux
    [root@localhost ~]# echo $?
    0

     1.5. 문자열및 디렉토리 논리테스트 및 값 비교

      1.5.1. 모든 명령은 완료 시 종료 코드를 생성합니다.

      1.5.2. 종료 상태를 보려면 test 명령을 실행한 직후에 $? 변수를 확인.

      1.5.3. 종료 상태 0은 보고할 내용이 없는 성공적인 종료를 나타내고, 0이 아닌 값은 일부 상태 또는 실패 의미.

      1.5.4. 숫자: 다른 숫자보다 큰지(gt), 크거나 같은지(ge), 작은지(lt), 작거나 같은지(le), 같은지(eq)

    [root@localhost ~]# test 5 -gt 3; echo $?
    0
    [root@localhost ~]# test 3 -gt 5; echo $?
    1
    [root@localhost ~]# test 3 -eq 3; echo $?
    0
    [root@localhost ~]# test 3 -eq 4; echo $?
    1
    [root@localhost ~]# test 3 -lt 5; echo $?
    0
    [root@localhost ~]# test 5 -lt 3; echo $?
    1

      1.5.5. 텍스트 문자열: 다른 텍스트 문자열과 같은지(= 또는 ==), 같지 않은지(!=),

    [root@localhost ~]# test sdkim = sdkim; echo $?
    0
    [root@localhost ~]# test sdkim == sdkim; echo $?
    0
    [root@localhost ~]# test sdkim != sdkim; echo $?
    1
    [root@localhost ~]# [[ sdkim = sdkim ]]; echo $?
    0
    [root@localhost ~]# [[ sdkim == sdkim ]]; echo $?
    0
    [root@localhost ~]# [[ sdkim != sdkim ]]; echo $?
    1

      1.5.6. 문자열의 길이가 0인지(z), 0이 아닌지(n) 연산자를 사용하여 테스트.

    [root@localhost ~]# babo=''; [[ -z "$babo" ]]; echo $?
    0
    [root@localhost ~]# babo='sdkim'; [[ -n "$babo" ]]; echo $?
    0

      1.5.6. 일반 파일(-f) 또는 디렉터리(-d)의 존재 유무

     

     

      1.5.7. 파일이 심볼릭 링크(-L), 사용자에게 읽기 권한(-r)이 있는지 등의 일부 특수 속성을 테스트 가능.

     

    2. if 문

     2.1. 정의

      2.1.1. 간단한 쉘 스크립트는 처음부터 끝까지 실행되는 명령의 집합.

      2.1.2. 프로그래머는 조건부 구조를 사용하여 쉘 스크립트에 의사 결정을 통합.

      2.1.3. 스크립트는 명시된 조건이 충족되면 특정 루틴을 실행.

     2.2. 구문

      2.2.1. if/then

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

       2.2.1.1.  chronyd 서비스가 아직 활성 상태가 아닌 경우 서비스를 시작

    [root@localhost ~]# systemctl is-active chronyd
    active
    [root@localhost ~]# systemctl stop chronyd
    [root@localhost ~]# systemctl is-active chronyd > /dev/null 2>&1
    [root@localhost ~]# if [[ $? -ne 0 ]]; then systemctl start chronyd; fi
    [root@localhost ~]# systemctl is-active chronyd
    active

      2.2.2. if/then/else

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

       2.2.2.1.  chronyd 서비스가 활성 상태가 아닐 때 서비스를 시작하고 활성 상태일 때 서비스를 중지

    # systemctl is-active chronyd
    active
    [root@localhost ~]# systemctl is-active chronyd > /dev/null 2>&1
    [root@localhost ~]# if [[ $? -ne 0 ]]; then \
    > systemctl start chronyd; \
    > else \
    > systemctl stop chronyd; \
    > fi
    [root@localhost ~]# systemctl is-active chronyd
    inactive

     

      2.2.3. if/then/elif/then/else

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

     

       2.2.3.1.  mariadb 서비스가 활성 상태일 경우 mysql 클라이언트를 실행, postgresql 서비스가 활성 상태일 경우 psql 클라이언트를 실행, mariadb  postgresql 서비스가 둘 다 비활성 상태인 경우 sqlite3 클라이언트를 실행

    [root@localhost ~]# systemctl is-active mariadb > /dev/null 2>&1
    [root@localhost ~]# MARIADB_ACTIVE=$?
    [root@localhost ~]# systemctl is-active postgresql > /dev/null 2>&1
    [root@localhost ~]# POSTGRESQL_ACTIVE=$?
    [root@localhost ~]$ if  [[ "$MARIADB_ACTIVE" -eq 0 ]]; then \
    mysql; \
    elif  [[ "$POSTGRESQL_ACTIVE" -eq 0 ]]; then \
    psql; \
    else \
    sqlite3; \
    fi

     

    728x90
Designed by Tistory.