case while 选项未显示 shell 脚本中的最后一个参数

case while 选项未显示 shell 脚本中的最后一个参数

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选项规范应该在::之后有一个。pgetopts 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..."

或者甚至是一个特定的函数来拒绝选项参数,-因为您在脚本中多次执行此操作。

相关内容