프로그래밍 언어/Shell Script

[bash] 명령행 인자 $0, $@, $#, $* (command line argument)

hanyoungyoo 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