-
[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
'프로그래밍 언어 > Shell Script' 카테고리의 다른 글
[bash] 파일, 디렉토리 경로(path) 다루기 dirname, basename (0) 2021.05.13