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..."
ここでは毎回エラーを2回印刷するので、コードを考慮する関数にしたいかもしれません。
exec 3>> "$masterlog"
function error {
print -ru2 -- "$@"
print -ru3 -- "$@"
}
# ...
error "Invalid..."
-
または、スクリプトでオプション引数を複数回実行するため、オプション引数を拒否する特定の関数もあります。