如何创建一个可以通过位置参数和命名参数接受信息的通用Bash函数

如何创建一个可以通过位置参数和命名参数接受信息的通用Bash函数,bash,arguments,options,getopt,getopts,Bash,Arguments,Options,Getopt,Getopts,我正在编写大量Bash函数,这些函数能够从使用getopts提供的位置参数或命名参数传递的命令行中获取不同的信息。其思想是,位置参数主要用于快速和直接的人类控制,而命名参数主要用于清晰和其他功能的控制。为了说明我是如何思考的,考虑一个可以从一个事物转换到另一个的函数。从广义上讲,此功能可用于快速模式或高级模式。在快速模式中,指定的参数很少,通常是位置参数,而在高级模式中,可以指定许多参数,通常是命名参数。例如 快速模式 此模式可按如下方式使用: function fileName1 fileNa

我正在编写大量Bash函数,这些函数能够从使用getopts提供的位置参数或命名参数传递的命令行中获取不同的信息。其思想是,位置参数主要用于快速和直接的人类控制,而命名参数主要用于清晰和其他功能的控制。为了说明我是如何思考的,考虑一个可以从一个事物转换到另一个的函数。从广义上讲,此功能可用于快速模式或高级模式。在快速模式中,指定的参数很少,通常是位置参数,而在高级模式中,可以指定许多参数,通常是命名参数。例如

快速模式 此模式可按如下方式使用:

function fileName1 fileName2
function -i fileName1 -o fileName2 -m -r 100 -v
function -m -v fileName1 fileName2 -r 100
它使用内部假设和自主测量将一个文件转换为另一个文件

高级模式 此模式可按如下方式使用:

function fileName1 fileName2
function -i fileName1 -o fileName2 -m -r 100 -v
function -m -v fileName1 fileName2 -r 100
该模式也可按如下方式使用:

function fileName1 fileName2
function -i fileName1 -o fileName2 -m -r 100 -v
function -m -v fileName1 fileName2 -r 100
注意,-v不接受任何参数。这是一个仅指定诸如详细性之类的内容的选项

因此,本例中的逻辑是假设第一个位置参数为fileName1,第二个位置参数为fileName2,除非使用-i或-o选项指定这些文件名中的任何一个,在这种情况下,使用它们是因为它们具有更高的优先级,并且忽略第一个和第二个位置参数


我请求以尽可能普遍的方式实现这些类型的需求的建议和指导,因为这种方法将应用于超过150个函数的库。

我使用@getopt@解析命令行参数。我现在不记得它是否解决了你的问题。但这对我很有用


我使用@getopt@解析命令行参数。我现在不记得它是否解决了你的问题。但这对我很有用

改编自

总是先尝试获取选项,如果失败,就恢复到只使用$1/$2/等

TEST=
SERVER=
PASSWD=
VERBOSE=
while getopts “ht:r:p:v” OPTION
do
     case $OPTION in
         h)
             usage
             exit 1
             ;;
         t)
             TEST=$OPTARG
             ;;
         r)
             SERVER=$OPTARG
             ;;
         p)
             PASSWD=$OPTARG
             ;;
         v)
             VERBOSE=1
             ;;
         ?)
             usage
             exit
             ;;
     esac
done

if [[ -z $TEST ]] || [[ -z $SERVER ]] || [[ -z $PASSWD ]]
then
     // Set variables from $1/$2/etc....
fi
改编自

总是先尝试获取选项,如果失败,就恢复到只使用$1/$2/等

TEST=
SERVER=
PASSWD=
VERBOSE=
while getopts “ht:r:p:v” OPTION
do
     case $OPTION in
         h)
             usage
             exit 1
             ;;
         t)
             TEST=$OPTARG
             ;;
         r)
             SERVER=$OPTARG
             ;;
         p)
             PASSWD=$OPTARG
             ;;
         v)
             VERBOSE=1
             ;;
         ?)
             usage
             exit
             ;;
     esac
done

if [[ -z $TEST ]] || [[ -z $SERVER ]] || [[ -z $PASSWD ]]
then
     // Set variables from $1/$2/etc....
fi
请注意,如果使用getopts。第二个警告是,如果使用getopts解析函数的参数,则必须在解析任何选项后将全局OPTIND变量重置为1。否则,我认为解决方案很简单:

argparse.sh 输出 请注意,如果使用getopts。第二个警告是,如果使用getopts解析函数的参数,则必须在解析任何选项后将全局OPTIND变量重置为1。否则,我认为解决方案很简单:

argparse.sh 输出
否的可能重复:您提到的问题涉及两种论点用法中的一种,而当前的问题涉及为接收相同信息而设计的论点的优先顺序。啊,在仔细阅读前面的问题之后,我现在看到了区别。很抱歉,我只回避了你的第一个问题。否的可能重复:你提到的问题涉及两种论点用法中的一种,而当前的问题涉及为接收相同信息而设计的论点的优先级。啊,我现在看到了区别,仔细阅读前面的问题之后。对不起,我只回避了你的第一个问题。谢谢你的建议。我不知道getopt可以通过什么方式返回它未接受的参数。谢谢你的建议。我不知道getopt可以通过什么方式返回它未接受的参数。非常感谢您的建议和高效的代码。我以前没有见过没有if语句的双方括号测试,但我看到了它的意义。我试图做的是有效地允许对带有指定选项字符串的getopts不能接受的参数进行解释。然后,我想使用优先级规则来解决出现的冲突。也许可以澄清一下。非常感谢您的建议和高效的代码。我以前没有见过没有if语句的双方括号测试,但我看到了它的意义。我试图做的是有效地允许对带有指定选项字符串的getopts不能接受的参数进行解释。然后,我想使用优先级规则来解决出现的冲突。也许我可以澄清一下。非常感谢你的建议。您的建议确实有一种明确的意义,但我试图做的是允许使用指定的选项字符串解释getopts不能接受的参数,而不放弃成功的getopts解析。然后
我想使用优先级规则解决产生的冲突。也许我可以澄清一下。非常感谢你的建议。您的建议确实有一种明确的意义,但我试图做的是允许使用指定的选项字符串解释getopts不能接受的参数,而不放弃成功的getopts解析。然后,我想使用优先级规则来解决出现的冲突。也许可以澄清一下。