저는 매우 간단한 bash 스크립트를 사용하고 있지만 해결할 수 없는 문제에 직면했습니다.
, , 의 myscript.sh
세 가지 매개변수 가 있습니다 . 둘 다 필수이며 스크립트를 실행해야 합니다.-u
-h
-p
-u
-h
내가 하고 싶은 것은 myscript.sh -u User1
그것이 전부라면 exit 1
.
myscript.sh -u User1 -h Localhost
옵션이 제공 되면 스크립트를 구문 분석하고 실행하고 , 그렇지 않으면 종료해야 합니다.
매우 감사합니다
답변1
어쩌면 이런 게 있지 않을까요?
#!/bin/bash
unset -v host
unset -v port
unset -v user
while getopts h:p:u: opt; do
case $opt in
h) host=$OPTARG ;;
p) port=$OPTARG ;;
u) user=$OPTARG ;;
*)
echo 'Error in command line parsing' >&2
exit 1
esac
done
shift "$(( OPTIND - 1 ))"
if [ -z "$host" ] || [ -z "$user" ]; then
echo 'Missing -h or -u' >&2
exit 1
fi
# The rest of the script continues here and may make use of
# "$host" and "$user", and possibly "$port".
여기서 주요 부분은 if
루프의 어떤 항목이 host
또는 변수에 할당되었는지 테스트하는 짧은 문입니다. 이러한 변수 중 하나라도 비어 있으면 코드는 이를 오류로 처리하고 간단한 진단 메시지를 인쇄한 후 종료됩니다.user
while
/bin/sh
위에 표시된 스크립트에는 bashishm이 포함되어 있지 않으므로 실행할 수도 있습니다 .
문 외에도 if
다음을 사용할 수 있습니다.
: ${host:?Missing -h}
: ${user:?Missing -u}
아니면 더 짧게,
: ${host:?Missing -h} ${user:?Missing -u}
이 :
명령은 아무 작업도 수행하지 않는 유틸리티이지만 해당 인수는 모든 명령과 마찬가지로 호출 셸에서 계속 처리됩니다. 위의 두 줄에 대해 쉘은 변수 확장을 시도하며 host
, user
변수가 설정되지 않거나 확장 결과 빈 문자열이 발생하는 경우 오른쪽에 다음 문자열이 출력되고 ?
스크립트는 다음과 같이 종료됩니다. 0이 아닌 상태:
$ bash script.sh -h somehost
script.sh: line 21: user: Missing -u
$ echo $?
1
이 ${variable:?text}
확장은 표준이므로 bash
다른 모든 POSIX sh
유사 셸에서 지원됩니다.