옵션이 쉘 스크립트의 마지막 인수를 표시하지 않는 경우

옵션이 쉘 스크립트의 마지막 인수를 표시하지 않는 경우

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옵션 사양에는 : 뒤에 인수가 있어야 합니다 :.pgetopts 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..."

-또는 스크립트에서 옵션 인수를 여러 번 수행하므로 옵션 인수를 거부하는 특정 함수도 있습니다 .

관련 정보