HOWTO · Bash

Bash에 입력 인수가 있는지 확인

이 자습서에서는 스크립트 사용자가 Bash 스크립트에 입력 인수를 전달했는지 확인하는 방법을 설명합니다.

이 페이지의 내용

Bash 스크립트의 위치 매개변수를 확인해 필수 인수가 전달되었는지 판단할 수 있습니다. $#으로 인수 개수를 세고, 첫 번째 인수의 값이 필요하면 $1을 사용하세요. 인수가 하나도 없는 호출을 거부하려면 개수를 확인하는 것이 확실합니다. $1을 확인하는 것은 다른 질문에 답합니다. 아래 예제에서는 사용자 입력에 의존하는 작업을 스크립트가 시작하기 전에 이 차이를 구분하는 방법을 살펴봅니다.

$#으로 Bash 스크립트 인수 개수 세기

$#은 현재 함수나 스크립트에 전달된 위치 인수의 개수로 확장됩니다. 개별 인수의 값이 들어 있는 것은 아닙니다. 예를 들어 ./script.sh one two로 스크립트를 실행하면 개수는 2이고, 인수 없이 실행하면 0입니다. 따라서 $#은 값을 읽거나 처리하기 전에 명령에 몇 개의 값이 전달되었는지 확인할 때 유용합니다. 함수 안에서도 같은 방식으로 동작하며, 이때 개수는 해당 함수에 전달된 인수를 나타냅니다.

값 세 개를 전달해 다음 예제를 실행해 보세요.

show_arguments() {
  printf 'Argument count: %s\n' "$#"
  printf 'First argument: %s\n' "$1"
}

show_arguments delft stack blog
Argument count: 3
First argument: delft

첫 번째 줄은 값의 개수를 출력하고, 두 번째 줄은 첫 번째 값을 출력합니다. 값이 하나 이상 필요한 스크립트라면 인수를 사용하는 명령보다 앞에 검사를 두세요. 다음은 검사 뒤에 전달된 값을 받아 처리하고, 값이 없으면 알기 쉬운 오류를 출력하는 완전한 스크립트입니다.

#!/usr/bin/env bash

require_arguments() {
  if (( $# == 0 )); then
    printf '%s\n' 'No input arguments exist' >&2
    return 1
  fi
}

run_check() {
  if ! require_arguments "$@"; then
    return 1
  fi
  printf 'Received %s argument(s).\n' "$#"
  printf 'First argument: %s\n' "$1"
}

run_check delft
Received 1 argument(s).
First argument: delft

이 독립 실행 예제는 delft를 전달하므로 검사를 통과하고, 스크립트는 개수와 첫 번째 값을 출력합니다.

호출자가 전달한 실제 인수를 검사하는 스크립트라면 진입점으로 run_check "$@"을 사용하세요. 인수가 없으면 require_arguments는 표준 오류에 No input arguments exist를 출력하고 1을 반환합니다. 그러면 run_check의 마지막 명령도 1을 반환하므로 스크립트 역시 종료 상태 1로 끝납니다. 인수가 하나 이상이면 검사를 건너뜁니다. 메시지를 바꾸거나 필요한 개수를 더 크게 검사할 수도 있습니다. 예를 들어 값 두 개가 필요하면 (( $# < 2 ))를 사용할 수 있습니다. 필요한 최소 개수는 스크립트의 나머지 부분에서 실제로 사용하는 값에 따라 정하고, 파일을 만들거나 설정을 바꾸는 것과 같은 부수 효과가 발생하기 전에 검사를 수행하세요.

함수를 호출하면 함수의 $#은 바깥 스크립트의 인수 개수가 아니라 함수 자체에 전달된 인수 개수를 나타냅니다. 함수가 그 값을 필요로 한다면 명시적으로 전달하세요. 이 차이는 스크립트가 선택적 플래그를 받은 뒤 일부 값만 보조 함수에 전달할 때 특히 유용합니다. 인수 개수는 숫자이므로 Bash의 산술식 (( $# == 0 ))은 매개변수의 문자열 내용을 검사하지 않고도 비교를 직접 표현합니다.

$1로 Bash의 첫 번째 인수 확인하기

$1은 첫 번째 위치 매개변수입니다. [[ -n "$1" ]]처럼 값을 검사하거나 출력할 때는 인용 부호로 감싸세요. 이 검사는 값이 비어 있지 않은지 확인합니다. 인수가 전달되었는지는 알려 주지 않습니다. 호출자가 ./script.sh ''처럼 비어 있는 첫 번째 값을 전달할 수 있으며, 이때도 $#은 1입니다. 즉, 값에 문자가 없어도 첫 번째 위치의 인수는 존재합니다. 인수의 존재 여부는 개수로, 내용은 값 검사로 확인하세요.

인수가 하나 이상 전달되어야 하는지 확인하려면 $#을 사용하세요. 첫 번째 인수에 비어 있지 않은 값이 있어야 하는지 확인하려면 인용 부호로 감싼 $1을 검사하세요. 위치 매개변수 $1, $2, $3은 각각 첫 번째, 두 번째, 세 번째 값을 나타냅니다. 다른 명령에 전달할 때는 값 안의 공백이 유지되도록 각각 인용 부호로 감싸세요. 예를 들어 첫 번째 값이 North Shore라면 "$1"로 감싸면 셸이 이를 여러 단어로 나누지 않고 하나의 값으로 전달합니다.

두 조건이 모두 필요한 작업에서는 검사를 결합할 수 있습니다. 먼저 (( $# > 0 ))으로 인수 개수를 확인한 다음 [[ -n "$1" ]]을 검사하세요. 두 판단을 분리하면 더 구체적인 오류 메시지를 표시할 수 있습니다. 인수가 생략되었다고 알리거나, 전달된 첫 번째 값에 글자가 있어야 한다고 안내할 수 있습니다. 첫 번째 인수가 선택 사항이라면 개수 검사를 생략하고, 해당 명령에서 값이 없을 때 어떻게 처리할지 정하세요. [[ ... ]]에서는 단어 분리와 파일 이름 확장이 일어나지 않지만, 의도를 분명하게 표현하려면 $1을 인용 부호로 감싸는 것이 좋습니다. 단일 대괄호 형식인 [ ... ]에서는 "$1" 같은 확장을 인용 부호로 감싸세요. 인용하지 않은 확장에는 단어 분리와 파일 이름 확장이 적용될 수 있습니다.