Bash:Getopts 从来没有 运行 核心循环
Bash: Getopts doesn't run core loop ever
我开始理解 getopts
的时候它刚刚停止 运行。当我在小型个人测试中尝试 getopts
时,它运行良好。我已经盯着我的屏幕看了几天了,现在检查出了什么问题,我什至使用了一个 shellchecker,它只是说一切都应该工作。我试图在 getopts
while 循环中回显,但它从未打印出来,更不用说我在案例中得到的回显了。这基本上是我的代码,
helpmenu(){
case in
general)
echo "Usage, some operationtypes, -h or --help idenifier explained"
;;
eachoperationtype)
echo "Explain this operationtype"
;;
}
operationtype=
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
脚本的要点是接受一个初始的第一个参数,即所需的操作类型,并在不同的 elifs
之后 运行 不同的 getopts
初始if
。每个人都会有它接受的特定数量的参数以及一系列可选标志。也就是说,您可以有一个执行 ./Script greetings "hello" -t 3
的脚本,例如可以 echo "hello"
3 次,并在同一脚本中有另一个函数 ./Script age -u User1
,例如在列表中给出 user1 的年龄。我正在处理的另一个问题是所需变量的设置,所需变量通常应该在没有标志的情况下收集。这个问题是我想要为每个操作类型弹出一个帮助菜单(回显快速用法) - 即 ./Script operation1 -h
returns operation1 的帮助菜单但是我不能允许这种语法,因为它会 return 尝试设置所需参数时出错。此外,我需要确保他们为每种操作类型放置了正确数量的所需参数,因为任何其他数量都会导致错误。提前感谢您的帮助。
编辑:
我用 shellcheck.net 检查了我的代码,我相信没有基于语法的错误。我需要的帮助不是真正的代码细节,而是实现我想要的结果的最佳方法,以及我在上面强调的粗略想法。这是最好的方法吗?我如何获得基于 operationtype
的 helpmenu
功能?为什么 getopts
运行ning 没有?抱歉造成任何混淆,我将删除 pastebin link,因为让您通读它根本不是我的本意。
问题中的 ASK 与 getopt 'traditional' 用法的主要区别在于命令行参数遵循结构
script sub-command [options] arguments
getopt 的 'traditional' 用例需要以下内容(并且命令可能从选项中隐含,或者是参数列表的一部分)。
script [options] arguments
这里需要做一些小的改动,提示 getopt 应该忽略第一个命令行参数。两个选项:移动参数列表,或更新 OPTIND 以跳过这些参数
# SHIFT the command outside the argument list
operationtype=
shift
if [[ operationtype == "Operation1" ]]; then
# Execute the operation 1
...
while getopts ":hs:d:m:f:a" opt; do
...
done
或更新 OPTIND 以跳过第一个参数。
operationtype=
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 所做的更改。
我开始理解 getopts
的时候它刚刚停止 运行。当我在小型个人测试中尝试 getopts
时,它运行良好。我已经盯着我的屏幕看了几天了,现在检查出了什么问题,我什至使用了一个 shellchecker,它只是说一切都应该工作。我试图在 getopts
while 循环中回显,但它从未打印出来,更不用说我在案例中得到的回显了。这基本上是我的代码,
helpmenu(){
case in
general)
echo "Usage, some operationtypes, -h or --help idenifier explained"
;;
eachoperationtype)
echo "Explain this operationtype"
;;
}
operationtype=
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
脚本的要点是接受一个初始的第一个参数,即所需的操作类型,并在不同的 elifs
之后 运行 不同的 getopts
初始if
。每个人都会有它接受的特定数量的参数以及一系列可选标志。也就是说,您可以有一个执行 ./Script greetings "hello" -t 3
的脚本,例如可以 echo "hello"
3 次,并在同一脚本中有另一个函数 ./Script age -u User1
,例如在列表中给出 user1 的年龄。我正在处理的另一个问题是所需变量的设置,所需变量通常应该在没有标志的情况下收集。这个问题是我想要为每个操作类型弹出一个帮助菜单(回显快速用法) - 即 ./Script operation1 -h
returns operation1 的帮助菜单但是我不能允许这种语法,因为它会 return 尝试设置所需参数时出错。此外,我需要确保他们为每种操作类型放置了正确数量的所需参数,因为任何其他数量都会导致错误。提前感谢您的帮助。
编辑:
我用 shellcheck.net 检查了我的代码,我相信没有基于语法的错误。我需要的帮助不是真正的代码细节,而是实现我想要的结果的最佳方法,以及我在上面强调的粗略想法。这是最好的方法吗?我如何获得基于 operationtype
的 helpmenu
功能?为什么 getopts
运行ning 没有?抱歉造成任何混淆,我将删除 pastebin link,因为让您通读它根本不是我的本意。
问题中的 ASK 与 getopt 'traditional' 用法的主要区别在于命令行参数遵循结构
script sub-command [options] arguments
getopt 的 'traditional' 用例需要以下内容(并且命令可能从选项中隐含,或者是参数列表的一部分)。
script [options] arguments
这里需要做一些小的改动,提示 getopt 应该忽略第一个命令行参数。两个选项:移动参数列表,或更新 OPTIND 以跳过这些参数
# SHIFT the command outside the argument list
operationtype=
shift
if [[ operationtype == "Operation1" ]]; then
# Execute the operation 1
...
while getopts ":hs:d:m:f:a" opt; do
...
done
或更新 OPTIND 以跳过第一个参数。
operationtype=
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 所做的更改。