Shell 脚本未显示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 中,重定向目标的扩展必须被引用。更一般地说,为了安全起见,您需要引用每个扩展。
错误应该出现在 stderr 上,而不是 stdout 上。因此print -ru2 -- "Invalid..."
,尽管在这里,由于您每次都会打印两次错误,因此您可能希望将其设置为一个对代码进行因式分解的函数:
exec 3>> "$masterlog"
function error {
print -ru2 -- "$@"
print -ru3 -- "$@"
}
# ...
error "Invalid..."
或者甚至是一个特定的函数来拒绝选项参数,-
因为您在脚本中多次执行此操作。