Bash:Getopts不';永远不要运行核心循环

Bash:Getopts不';永远不要运行核心循环,bash,function,syntax,getopts,Bash,Function,Syntax,Getopts,我开始理解getopts的时候,它就停止运行了。当我在小型的单独测试中尝试getopts时,它工作得非常好。我已经盯着我的屏幕看了几天了,现在检查出了什么问题,我甚至用了一个shellchecker,它只是说一切都应该正常。我试图在getoptswhile循环中进行回音,但它从未打印,更不用说我在箱子中的回音了。这就是我的代码 helpmenu(){ case $1 in general) echo "Usage, some operationtypes, -

我开始理解
getopts
的时候,它就停止运行了。当我在小型的单独测试中尝试
getopts
时,它工作得非常好。我已经盯着我的屏幕看了几天了,现在检查出了什么问题,我甚至用了一个shellchecker,它只是说一切都应该正常。我试图在
getopts
while循环中进行回音,但它从未打印,更不用说我在箱子中的回音了。这就是我的代码

helpmenu(){
   case $1 in
      general)
         echo "Usage, some operationtypes, -h or --help idenifier explained"
         ;;
      eachoperationtype)
         echo "Explain this operationtype"
         ;;

}
operationtype=$1
if [[ operationtype == "Operation1" ]]; then

   # Setting some variables to default values here
   var1=0 #Default values
   var2=4
   var3=5
   ...

   echo "this prints" # this prints

   while getopts ":hs:d:m:f:a" opt; do

           echo "does not print" # this does not print

           case ${opt} in
                   h )
                       helpmenu operationtype #Simple function that prints out script usage
                       ;;
                   s )
                       var=$OPTARG
                       ;;
                d )
                       var2=$OPTARG
                       ;;       
                m )
                       var3=$OPTARG
                       ;;
                f )
                       var4=$OPTARG
                       ;;
                a )
                       bool=true
                       ;; 
                \? )
                    echo "Syntax error: Unrecognised flags given"
                    helpmenu operationtype
                    ;;
                : )
                    echo "Syntax error: Invalid number of arguments"
                    helpmenu general # No arguments given - shows help menu with operationtypes so they can ./Script operationtype -h
                    ;;
        esac
   done 
   shift $((OPTIND -1))

   # Do some other stuff, works fine

#Other operations have similar structure to operationtype1
elif [[ operationtype == "operation2" ]]; then
   # Similar program, potentially different flags, function, meaning etc
fi
该脚本的要点是引入一个初始的第一个参数,该参数是所需的操作类型,并在初始的
if
之后在不同的
elifs
中运行不同的
getopts
。每一个都有它接受的特定数量的参数以及可选标志的列表。i、 e.您可以有一个脚本执行
/script问候语“hello”-t3
,例如
回送“hello”
3次,并且在同一个脚本中有另一个函数,例如在列表中给出User1的年龄。我正在处理的另一个问题是所需变量的设置,所需变量通常应在没有标记的情况下收集。问题是,我希望为每个操作类型弹出一个帮助菜单(呼出一个快速用法),即
/Script operation1-h
返回操作1的帮助菜单,但是我不能允许这种语法,因为它在尝试设置所需参数时会返回错误。此外,我还需要确保他们为每个operationtype输入正确数量的所需参数,因为任何其他数量都会导致错误。提前谢谢你的帮助

编辑:
我已经用shellcheck.net检查了我的代码,我相信没有基于语法的错误。我需要的帮助不是真正的代码细节,而是实现我想要的结果的最佳方式,以及我上面强调的粗略想法。这是最好的方法吗?如何获得基于
帮助菜单的
操作类型
功能?为什么
getopts
没有运行?很抱歉造成混淆,我将删除pastebin链接,因为让您阅读它完全不是我的本意。

问题中的提问与getopt的“传统”用法之间的主要区别在于命令行参数遵循结构

script sub-command [options] arguments
getopt的“传统”用例需要以下内容(该命令可以从选项中暗示出来,或者是参数列表的一部分)

这里需要做一些小的修改,向getopt提示应该忽略第一个命令行参数。两个选项:移动参数列表,或更新选项并跳过这些参数

# SHIFT the command outside the argument list
operationtype=$1
shift
if [[ operationtype == "Operation1" ]]; then
   # Execute the operation 1
   ...
   while getopts ":hs:d:m:f:a" opt; do
   ...
   done
或更新OPTIND以跳过第一个参数

operationtype=$1
OPTIND=$((OPTIND+1))
if [[ operationtype == "Operation1" ]]; then
   # Execute the operation 1
   ...
   while getopts ":hs:d:m:f:a" opt; do
   ...
   done
注意:这些解决方案中的每一个都可用于提供2组选项。一个用于脚本,一个用于子命令。例如,
docker
命令行:

docker [options] sub-command [sub-command options]
原始答案:


完全修改为解决OP所做的更改。

这应该是一条注释,而不是答案。@DragsawDragon请发布一条(在您的问题中,而不是通过pastebin链接)。这里有人愿意帮助解决您的问题,但请不要让他们费力地阅读大量不相关的代码和/或试图找出哪些代码错误是真实的,哪些是由于问题的不正确简化造成的。@chepner,语法错误已解决,我将修改答案以解决处理getopt的问题,第一个参数是命令
docker [options] sub-command [sub-command options]