オプションがシェルスクリプトの最後の引数を表示しない場合

オプションがシェルスクリプトの最後の引数を表示しない場合

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..."ここでは毎回エラーを2回印刷するので、コードを考慮する関数にしたいかもしれません。

exec 3>> "$masterlog"
function error {
  print -ru2 -- "$@"
  print -ru3 -- "$@"
}

# ...

error "Invalid..."

-または、スクリプトでオプション引数を複数回実行するため、オプション引数を拒否する特定の関数もあります。

関連情報