내 샘플 파일은 다음과 같습니다.
!/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
미리 준비해보세요.