매개변수 대체 및 오류 메시지: 줄 번호 표시 등을 억제합니다.

매개변수 대체 및 오류 메시지: 줄 번호 표시 등을 억제합니다.

내 샘플 파일은 다음과 같습니다.

!/bin/bash
# argument-one

# Is first argument missing?

# First method
[[ "$1" == "" ]] && echo "Usage: $(basename $0) filename"; exit 1

# Second method
# filename=${1?"Usage: $(basename $0) filename"}

위 스크립트에서는 "깨끗한" 메시지를 받았습니다.

Usage: argument-one filename

인수 없이 위 스크립트를 실행하면 깔끔하게 종료됩니다.

그러나 7행을 주석 처리하고 10행의 주석 처리를 제거하면 프로그램이 다음 오류 메시지와 함께 종료됩니다.

./argument-one: line 10: 5: Usage: argument-one filename

이 메시지는 프로그램을 종료하게 만든 프로그램에 문제가 있음을 나타냅니다. 실제로는 사용 문제인 인수 없는 호출이었습니다.

그러나 10번째 줄이 더 간결하고 가능한 경우 변수도 할당하므로 더 좋습니다.

내 질문은 "메시지 부분만 유지하고 ./argument-one: line 10: 5:메시지 부분을 사용하여 필터링하거나 비활성화하는 방법은 무엇입니까?" 입니다.

감사해요.

답변1

특수 변수를 사용하여 $#특정 명령에 대한 인수 수를 테스트할 수 있습니다.

usage() {
  echo "Usage: $0 arg"
  exit 1
}

if [[ "$#" -eq 0 ]]; then
  usage
fi

echo "called with $1"
exit 0

실행되면 스크립트는 다음을 제공합니다.

$ ./foo.sh
Usage: ./foo.sh arg

$ ./foo.sh bar
called with bar

답변2

매개변수 대체를 사용하여 할당을 수행할 수 있지만 오류를 포착하여 변경합니다.

filename=$((printf "${1:?}") 2>/dev/null || { echo "Usage $(basename $0) filename"; exit 1; })

( 더 적은 수의 문자로 사용할 printf수 있지만 echo추가 포크가 필요합니다). printf/echo는 자체 하위 쉘에 있으며 실제로 /dev/null에 있는 하위 쉘의 표준 오류로 파이프됩니다.

또는 매개변수 대체를 사용하여 할당된 변수가 설정되어 있고 비어 있지 않은지 테스트한 다음 사용 문자열을 인쇄하고 수동으로 종료할 수 있습니다(한 번에 한 줄).

[ -z "${filename:=$1}" ] && { echo "Usage $(basename $0) filename"; exit 1; }

나는 문자 수가 적고, 더 명확하고 직접적이며, 재작업이 덜 필요하기 때문에 두 번째 옵션을 선택하는 경향이 있습니다. 한 가지 단점은 파일 이름이 이미 환경에 설정되어 있으면 $1이 사용되지 않는다는 것입니다. 이런 걱정이 되신다면 unset filename미리 준비해보세요.

관련 정보