스택오버플로우 게시물명령줄 인수를 처리하기 위한 템플릿이 있습니다.
이 테스트는 [ $# == 0 ]
bash 스크립트가 매개변수 없이 실행되어서는 안 된다는 것을 의미합니까? 템플릿이기 때문에 일반적으로 스크립트에 매개 변수가 반드시 필요하지는 않다고 생각합니다.
case
성명서 에서 이 두 상황의 차이점은 무엇입니까 *)
? "?")
그들은 똑같아 보인다.
# --- Options processing -------------------------------------------
if [ $# == 0 ] ; then
echo $USAGE
exit 1;
fi
while getopts ":i:vh" optname
do
case "$optname" in
"v")
echo "Version $VERSION"
exit 0;
;;
"i")
echo "-i argument: $OPTARG"
;;
"h")
echo $USAGE
exit 0;
;;
"?")
echo "Unknown option $OPTARG"
exit 0;
;;
":")
echo "No argument value for option $OPTARG"
exit 0;
;;
*)
echo "Unknown error while processing options"
exit 0;
;;
esac
done
shift $(($OPTIND - 1))
param1=$1
param2=$2
답변1
스크립트에는 하나 이상의 매개변수가 필요하며, 매개변수가 없으면 사용법 정보를 표시합니다. echo $USAGE >&2
버그이기 때문에 이렇게 해야 합니다 . 다른 스크립트에서는 매개변수가 0개일 수 있으므로 수정해야 합니다. 일부 사람들이 이 주장을 받아들이지 않는 것처럼요 i
.
"?",그리고 *
예, 다릅니다.
"?"
그는 하나를 찾고 있다고 말했다?
. 이것은 예상치 못한 옵션(잘못된 옵션)을 발견했을 때 getopts가 반환하는 것입니다.*
일치하는 다른 항목을 찾을 수 없으면 케이스에 이렇게 하세요. 이런 일은 일어나서는 안 되지만 일어날 수 있습니다. getopts의 버그이거나 프로그램의 버그일 가능성이 높습니다(방어 프로그래밍 참조).
답변2
그것들은 동일해야 합니다.
그러나 이 코드에는 다음과 같은 문제가 있습니다.
- 산술 확장을 참조하지 못했습니다.
shift "$(($OPTIND - 1))"
==
비이동형 연산자 사용- 표준 출력에 오류 메시지 쓰기
- 오류가 발생하면 상태 0(성공)으로 종료됩니다.
- 변수를 참조하지 못했습니다
"$#"
.echo "$USAGE"
- 인수가 없는 경우 검사가 제대로 이루어지지 않았습니다.뒤쪽에속지 않도록 getopts 루프를 실행합니다.
script --
- 쓸데없는 참고자료
v
,h
그리고i
:i:vh