[bash] 명령행 인자 $0, $@, $#, $* (command line argument)
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