getopts
쉘 스크립트는 사용된 명령 while
의 마지막 값을 표시하지 않습니다 . 아래 명령과 코드 및 출력을 참조하세요.
주문하다:nohup ksh newtome.ksh -m 100 -l LSD -t 10202020 -p ABC,CDE > log.txt &
masterLog="/testing/log/jlog123.txt"
if [ $# -lt 8 ]; then
echo "Usage: $0 -m ab -l cd -t ef -p gh"
echo "Usage: $0 -m ab -l cd -t ef -p gh" >> $masterLog
exit 1
fi
while getopts m:l:t:p option
do
case ${option} in
m) if [[ ${OPTARG} = -* ]]; then
echo "Invalid parameter \"${OPTARG}\" provided for argurment \"-${option}\""
echo "Invalid parameter \"${OPTARG}\" provided for argurment \"-${option}\"" > $masterLog
exit 1;
fi
ab=$OPTARG;;
l) if [[ ${OPTARG} = -* ]]; then
echo "Invalid parameter \"${OPTARG}\" provided for argurment \"-${option}\""
echo "Invalid parameter \"${OPTARG}\" provided for argurment \"-${option}\"" > $masterLog
exit 1;
fi
cd=$OPTARG;;
t) if [[ ${OPTARG} = -* ]]; then
echo "Invalid parameter \"${OPTARG}\" provided for argurment \"-${option}\""
echo "Invalid parameter \"${OPTARG}\" provided for argurment \"-${option}\"" > $masterLog
exit 1;
fi
ef=$OPTARG;;
p) if [[ ${OPTARG} = -* ]]; then
echo "Invalid parameter \"${OPTARG}\" provided for argurment \"-${option}\""
echo "Invalid parameter \"${OPTARG}\" provided for argurment \"-${option}\"" > $masterLog
exit 1;
fi
gh=$OPTARG;;
\?) print "Usage: $0 -p password -i ds" > $masterLog
print >&2 "echo "Usage: $0 -m ab -l cd -t ef -p gh""
exit 1;;
esac
done
산출:
+ getopts m:l:t:p option
+ ab=100
+ getopts m:l:t:p option
+ cd=LSD
+ getopts m:l:t:p option
+ ef=10202020
+ getopts m:l:t:p option
+ gh=
+ getopts m:l:t:p option
답변1
이것:
p) if [[ ${OPTARG} = -* ]]; then
echo "Invalid parameter \"${OPTARG}\" provided for argurment \"-${option}\""
echo "Invalid parameter \"${OPTARG}\" provided for argurment \"-${option}\"" > $masterLog
exit 1;
fi
gh=$OPTARG;;
이 p
옵션에는 인수가 필요하므로 getopts
옵션 사양에는 : 뒤에 인수가 있어야 합니다 :
.p
getopts m:l:t:p: option
이것이 없으면 -p
옵션은 매개변수가 없는 옵션으로 처리됩니다.
btw로 -
시작하는 옵션 매개변수가 금지되는 이유는 무엇입니까?
또한 echo
임의의 데이터와 함께 사용할 수 없으므로 printf '%s\n' ...
또는 를 사용하십시오 print -r -- ...
. ksh88에서는 리디렉션 대상의 확장자를 인용해야 합니다. 보다 일반적으로는 안전을 위해 각 확장명을 인용해야 합니다.
오류는 stdout이 아닌 stderr에 나타나야 합니다. 하지만 print -ru2 -- "Invalid..."
여기서는 매번 오류를 두 번씩 인쇄하므로 코드를 고려하는 함수로 만들고 싶을 수도 있습니다.
exec 3>> "$masterlog"
function error {
print -ru2 -- "$@"
print -ru3 -- "$@"
}
# ...
error "Invalid..."
-
또는 스크립트에서 옵션 인수를 여러 번 수행하므로 옵션 인수를 거부하는 특정 함수도 있습니다 .