Bash 쉘 스크립트 기초: 매개변수 확장과 환경변수 활용

💡 핵심 요약 (Executive Summary)

본 가이드는 bash doc1 핵심 가이드 및 실전 아키텍처의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.

📑 Table of Contents
Reference & Guidelines (NOTE)
예시
bash
#!/bin/bash
# My First Script Program
 
printf "I love UNIX !\n"
pwd

exit 0
스크립트 구성요소
  1. ! (매직 넘버)

  2. 스크립트 파일의 가장 처음에 위치
  3. 스크립트를 실행할 프로그램을 지정
  4. 쉘이 아닌 커맨드에서도 사용 가능. ex) #!/bin/more
  5. # (주석)
  6. 쉘 명령
  7. 쉘에서 실행 가능한 커맨드를 포함할 수 있음.
  8. 쉘 프로그램 → 아래에 기술
Shell Program 문법요소
  1. 쉘 변수
  2. 지정 방식: varname = value
  3. 변수 표현식

    형식 기능 결과 시뮬레이션
    $name name의 값으로 대체
    $(name) name의 값으로 대치. 변수 이름이 다른 구문과 인접해 있을 때 사용
    $(name:-word) name이 정의되어있으면 그 값을 사용. 아니면 word 사용 if name==null { null }
    if name==undefined { ‘word’ }
    if hasVal(name) { name }
    $(name:=word) name이 정의되지 않았거나, null이면 word를 대입하고 그 값을 사용 if name==null { ‘word’ }
    if name==undefined { ‘word’ }
    if hasVal(name) { name }
    $(name:+word) name이 정의되어 있고, 그 값이 null이 아니면 word를 사용 if name==null { null }
    if name==undefined { undefined }
    if hasVal(name) { ‘word’ }
    $(name:?word) name이 정의되어 있고, 그 값이 널이 아니면 그 값을 사용, 그렇지 않으면 word 출력 후 종료. if name==null
    { print(‘word’) and exit() }
    if name==undefined
    { print(‘word’) and exit() }
    if hasVal(name)
    { name }
  4. 변수 문자열 처리 – 값이 문자열일 경우 문자열 내 패턴을 찾아 일부분 제거하는 표현식

    형식 기능
    ${variable%pattern} variable내 값의 뒤부터 패턴과 일치하는 첫번째 부분을 찾아서 제거
    ${variable%%pattern} variable내 값의 뒤부터 패턴과 일치하는 가장 큰 부분을 찾아서 제거
    ${variable#pattern} variable내 값의 앞부터 패턴과 일치하는 첫번째 부분을 찾아서 제거
    ${variable##pattern} variable내 값의 앞부터 패턴과 일치하는 가장 큰 부분을 찾아서 제거
  5. 인자처리
  6. 스크립트 실행할때 인자로 주어진 값, 매개변수
  7. 위치매개변수

    명령행 인자 의미
    $0 쉘 스크립트의 이름
    $1 - $9 커맨드 실행시에 주어진 첫번쨰부터 9번쨰까지 인자
    $(10) 10번째 인자
    $# 전체 인자 개수
    $ 모든 인자→ \$1 \$2 \$3
    $@ \$*과 동일함
    “$” 모든 인자→ “\$1 \$2 \$3”
    “$@” 모든 인자→ “\$1” “\$2” “\$3”
    $? 최근 실행된 명령의 종료 값
  8. 실행문법
  9. 특수문자 처리

    인용부호 기능 사용법
    작은 따옴표 (’ ‘) 모든 특수문자들이 해석되는것을 막음 echo ‘$test’
    $test
    큰 따옴표 (” “) 변수나 명령의 대체만 허용 echo “$test”
    100
    백 슬래시 (\) 단일문자가 해석되는것을 막음 echo \$test
    $test
  10. 명령 실행결과를 값(문자열)로 리턴
    | 기호 | 사용법 |
    | — | — |
    | 백 쿼터 (` `) | echo `date` |
    | \$(명령) | echo \$(date) |
  11. 입력스트림
  12. 정적 입력 – 터미널이나 파일로부터의 입력, 단일행
    1. 형식

      형식 용도
      read x 표준입력에서 한 행을 입력받아 변수 \$x에 저장
      read first last 표준입력에서 한 행을 입력받아 첫번째 단어를 변수 \$first에 저장하고 나머지 모두를 변수 \$last에 저장
      read -p prompt prompt를 출력하고 입력을 기다린다. 입력된 값은 변수 \$REPLY에 저장
    2. 사용 예시
bash
#!/bin/bash
         # 키보드 입력 처리를 테스트 하는 스크립트 
          
         read   x                   # 아무 메시지 없이 사용자 입력을 기다림 
         echo  "x : $x"             # 사용자가 임의의 값을 입력하면 출력 
          
         read  x   y                # 첫 단어는 x, 나머지는 y에 저장
         echo "x is $x  y is $y"    # x, y 값 출력 
          
         read  -p “Input : “        # Input : 을 출력한 후 입력 기다림
         echo "input : $REPLY"      # $REPLY에 자동 저장된 입력값 출력
  1. 동적 입력 – 명령문으로 입력받기, 여러행
    1. 형식
      command << TERMINATOR
      입력내용
      TERMINATOR

      TERMINATOR는 임의로 정하는 명칭이며 흔히 EOF(End Of File)을 사용한다.
    2. 사용 예시
bash
#!/bin/bash
          
         # 주석
         << EOF
         AAAAAA
         BBBBBB
         CCCCCC
         EOF

         # here 문서 테스트. user1에게 메일을 보냄 
         mail user1 << END 
         This is a test mail for here document 
         END
  1. 연산자

    연산자 의미 사용 예시
    - 음수 -x
    ! 논리 부정(NOT) (( ! x < y ))
    ~ 비트 반전(NOT) ~y
    * / % 곱셈, 나눗셈, 나머지 let y=3 * 5
    + - 덧셈, 뺄셈 let x=x+1
    << >> 비트왼쪽 시프트, 비트 오른쪽 시프트 (( y = x << 3 ))
    <= >= < > == != 비교 연산 (( x < y ))
    & ^ | 비트 AND, XOR, OR let “z = x ^ y”
    && || 논리 AND, OR (( x
    = 변수값 지정 let z=1
    *= /= %= += == <<= >>= &= ^= |= 단축 연산 let z+=1
  2. 제어문

  3. 조건 테스트 - 문자열 연산자
    | 문자열 연산자 | 동작 |
    | --- | --- |
    | str = pattern
    str == pattern
    | str이 pattern과 일치. = 연산자 양쪽에 공백 |
    | str != pattern | str이 pattern과 일치하지 않음 |
    | str | str이 null이 아님 |
    | -z str | str 길이가 0 |
    | -n str | str 길이가 0이 아님 |
    | -l str | str의 길이 리턴 (조건식이 아님) |
  4. 조건 테스트 - 플래그

    test 플래그 동작
    -a file 파일이 존재
    -e file 파일이 존재
    -L file 심볼릭 링크 파일
    -O file 사용자가 file의 소유자
    -G file 파일의 그룹 ID가 스크립트의 그룹 ID와 같음
    -S file 소켓 파일
    -r file 읽기 가능
    -w file 쓰기 가능
    -x file 실행 가능
    -b file 블록 장치 특수 파일
    -c file 문자 장치 특수 파일
    -d file 디렉토리 파일
    -p file 파이프 파일
    -u file setuid 권한 부여 파일
    -g file setgid 권한 부여 파일
    -k file sticky bit 접근 권한 부여 파일
    -s file 파일의 크기가 0이 아님
    1. 조건문 - if

      bash
      #!/bin/bash
         #  test_elif: if-elif 문 테스트 
              
         echo  “Input Score : “
         read score
          
         if (( $score >= 90 )); then 
            echo  “Your score is great. “
         elif (( $score >= 80 )); then 
            echo  “Your score is good. “
         else 
            echo “Your score is not good. “ 
         fi
  5. 조건문 - case

bash
#!/bin/bash
      # case 테스트 스크립트
      : <<EOF
      주어진 변수의 값에 따라 실행할 명령 따로 지정
      변수의 값이 value1 이면 value1부터 ;;을 만날 때까지 명령 실행
      값의 지정에 특수기호, | (or 연산자) 사용 가능
      일치하는 값이 없으면 기본값인 * 부터 실행
      EOF
       
      echo "Select command :"
      read  cmd
       
      case $cmd in
      [0-9])                # 0부터 9까지 임의의 숫자
         date
         ;;
      "cd" | "CD")        # cd 또는 CD
         echo $HOME
         ;;
      [aA-C]*)             # 소문자 a, 대문자 A,B,C로 시작하는 임의의 문자열
         pwd
         ;;
      *)
         echo" Usage : select command"
         ;;
      esac
  1. 반복문 - for
bash
#!/bin/bash
      #  test_for: for 테스트 스크립트 
      : <<EOF
      list 내 모든 엘레먼트를 변수로 반환하며 반복 (forEach)
      list 대신 $(<file)을 사용하면 외부 파일의 내용을 입력으로 받아서 처리한다.
      EOF
       
      for num in 0 1 2 
      do 
         echo "Number is $num" 
      done
  1. 반복문 - while
bash
#!/bin/bash 
      # test_while: while을 이용해 1부터 10까지 합을 구하는 스크립트 
      : <<EOF
      조건이 true인 동안 명령 반복
      EOF

      count=1                    
      sum=0 
       
      while (( count <= 10 ))     
      do 
           (( sum += count ))       
           let  count+=1             
      done 
       
      echo "Sum(1~10) : $sum"
  1. 반복문 - until
bash
#!/bin/bash 
      # test_until: 지정한 사용자가 로그인하면 알리는 스크립트 
      : <<EOF
      #조건이 true가 될때까지 명령 반복
      EOF

      echo  "Input name :"   # 입력 안내문 출력
      read  person                  # 유저 이름을 person에 저장 
       
      until  who | grep $person   # > /dev/null 
      do 
          sleep  5                 # 유저가 접속 중이 아니면 5초 쉼 
      done
  1. 반복문 - select
bash
#!/bin/bash 
      # test_select: 사용자 입력에 따라 pwd,date 명령실행 
      : <<EOF
      메뉴를 생성할 수 있는 반복 실행문이다.
      list에 지정한 항목을 자동으로 선택 가능한 메뉴로 만들어 화면에 출력해준다.
      사용자는 각 항목에 자동으로 부여된 번호를 선택한다.
      사용자 입력은 select와 in 사이에 지정된 변수에 저장
      보통 case 문과 결합하여 입력 값을 처리한다.
      EOF

      PS3="Input command(1~3) " 
       
      select cmd in pwd date quit 
      do                           
         case $cmd in             
         pwd) 
              pwd ;; 
         date) 
              date;; 
         quit) 
              break;;               
         *) 
              echo "Invalid input. select number" 
              ;; 
         esac 
         REPLY= 
      done
  1. 반복 제어문 - continue
bash
#!/bin/bash
      #  test_cont: continue 테스트 
      : << EOF
      루프 안에서 사용한다.
      이후 실행 순서를 무시하고 루프의 처음으로 돌아가는 명령
      숫자를 지정하면 중첩된 루프 안에서 특정 루프의 처음으로 돌아갈 수 있다.
      EOF
       
      for person in $(< list)          # `cat list`와 동일 
      do 
          if [[ $person == user2 ]] then 
             continue                    # user2 이면 건너뜀
          fi 
          echo “Hello, $person”
      done
  1. 함수
  2. 선언문
bash
# typeset -f 명령어를 통해 시스템에 등록된 함수를 확인 할 수 있다.

      function {{ 함수명 }}
      {
      	...
      }
  1. 함수 종료 - return
bash
#!/bin/bash
      #  함수 리턴값 테스트 
       
      function sum { 
         typeset  sum 
       
         (( sum= $1 + $2 ))
         return $sum 
      } 
       
      sum $1 $2 
      echo "$1 + $2 = $?"

      # 함수 본문 안의 마지막 문장 실행
      # return 문 실행
      # +) 지정한 값이 함수의 종료값으로 $?에 저장된다.

      # 결과 : 
      # bash {{ filename }} 3 4
      # 3 + 4 = 7
  1. 함수 삭제 - unset
bash
unset -f { 함수명 }
  1. 디버깅
    1. bash -x

      bash
      # 가장 간단한 스크립트 실행 오류 수정방법이다.
         # 스크립트의 각 행이 실행될 때마다 화면에 출력된다.
         bash -x { 함수명 }
  1. trap

    bash
    #!/bin/bash 
       # test_trap: trap 테스트 스크립트 
        
       trap  'echo "$LINENO : count=$count " '  DEBUG
        
       count=1                    
       sum=0 
        
       while (( count <= 10 ))     
       do 
            (( sum += count ))       
            let  count+=1             
       done 
        
       echo "Sum(1~10) : $sum "
    
       # * 지정한 시그널이 스크립트로 전달될 때마다 지정한 명령 실행
       # * 스크립트의 명령이 한 줄씩 실행될 때마다 DEBUG 시그널이 스크립트로 전달된다.
       # * DEBUG 시그널을 받을 때마다 원하는 변수 값 출력이 가능하다.   
       # => 즉. 스크립트가 실행되는 도중 변수값 확인이 가능하다.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *