ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [bash] 명령행 인자 $0, $@, $#, $* (command line argument)
    프로그래밍 언어/Shell Script 2021. 5. 14. 10:50

    C언어에서 명령행 인자를 받는 것처럼 Bash 스크립트에서도 명령행 인자를 받습니다.

    int main(int argc, char * argv[])  

     

    명령행 인자는 Bash 스크립트를 실행할 때 커맨드라인에서 직접 받은 입력으로

    C언어와 비교해보자면 argc에 해당하는 건 $#, argv[0]는 $0, argv[1]는 $1 로 매칭할 수 있습니다.

     

    즉, 명령행 인자의 개수나 몇 번째 명령행 인자 등을 받아서 스크립트 내에서 처리할 수 있는 기능을 지원 합니다. 그렇다면 어떤 종류가 있고 어떻게 사용하는 지 알아보도록 합시다.

     

    명령행 인자의 종류?


    아래와 같이 3가지 종류의 인자로 구분할 수 있는데요.

    # 위치 인자(Positional argument)
    $0, $1, $2, ... ${10}, ${11} ...
    
    # 인자의 개수 
    $#
    
    # 인자 전체
    $@ 
    $*

     

    각각의 인자가 무엇을 가지고 있는 지 아래의 예제를 통해 확인해보도록 하겠습니다.

    #!/bin/bash
      
    #첫번째, 두번째, 세번째 인자
    echo "$0"
    echo "$1"       
    echo "$2"
    
    #인자의 개수
    echo "$#"
    
    #모든 인자를 별도의 단어로
    echo "$@"
    
    # 모든 인자를 하나의 단어로
    echo "$*"

    실행결과

    위의 실행결과와 같이 아래와 같이 저장되는 것을 볼 수 있습니다.

     

    $0 = "./argv.sh"

    $1 = "first"

    $2 = "second"

     

    $# = 3

     

    $@ = "first", "second", "third"

    $* = "first second third"

     

    위의 인자들은 직관적으로 알겠는데, 그렇다면 $@와 $*의 정확한 차이는 무엇일까요?

    #!/bin/bash
      
    # 모든 인자를 별도의 단어로
    for argv in "$@"
    do
            echo $argv
    done
    
    # 모든 인자를 하나의 단어로
    for argv in "$*"
    do
            echo $argv
    done

    실행결과

    위의 for loop에서는 아래와 같이 출력이 되고,

    first
    second
    third

     

    아래의 for loop에서는 아래와 같이 출력이 되는 것을 볼 수 있습니다. $@는 인자를 각각, $*는 인자를 하나의 문자열로 처리하는 것을 보실 수 있습니다. 

    first second third

     

     

    다음은 예시를 통해 활용하는 방법을 알아보려 합니다.


    1. Bash 명령행 인자가 입력되지 않으면 스크립트를 종료

    #!/bin/bash
    
    display_usage() { 
    	echo "At lest 3 arguments are required"
    }
    
    if [  $# -le 2 ] 
    then 
        display_usage
        exit 1
    fi
    
    echo "Do something great!!"

    실행결과

    위와 같이 명령행 인자가 정해진 숫자만큼 입력되지 않으면 스크립트를 실행하지 않고

    사용방법을 출력하고 종료하는 방식으로 사용할 수 있습니다. 

     

    2. Bash 플래그(Flag), 옵션(Option) 처리하기 

    #!/bin/bash
    
    while [[ $# -gt 0 ]]
    do
    key="$1"
    
    case $key in
        -i|--id)
        ISSUE_ID="$2"
        shift
        shift
        ;;
        -b|--build)
        BUILD_MODE="$2"
        shift
        shift
        ;;
        *)
        shift
        ;;
    esac
    done
    
    echo "Issue: $ISSUE_ID"
    echo "Mode: $BUILD_MODE"

    실행 결과

    위와 같이 shift 커맨드를 활용하여 옵션들을 처리해줄 수 있는데요, shift 연산은 

     

    #Before shift
    $1 = "-b"
    $2 = "all"
    $3 = "-i"
    $4 = "failure"

    위와 같이 저장된 명령행 인자를 아래와 같이 만들어 줍니다.

    #After shift
    $1 = "all"
    $2 = "-i"
    $3 = "failure"

     

    이상 bash에서 명령행 인자 사용법이었습니다. 좀 더 좋은 예제를 발견할 경우 차차 추가할 생각입니다:)

    혹시 이상한 부분이 있거나 이해가 안 되는 경우가 있다면 댓글 남겨 주시기 바랍니다!

     

    참고)

    https://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash

    댓글

Designed by Tistory.