在bash中,我如何能够拥有一组任意顺序的参数?像键值对吗?

在bash中,我如何能够拥有一组任意顺序的参数?像键值对吗?,bash,Bash,示例: ./myscript --ip 192.168.1.1 --port 1985 或其他可能的 ./myscript --port 1985 --ip 192.168.1.1 我希望允许脚本以任意顺序获取一组参数 ./myscript a b c d ./myscript d c b a ./myscript b d a c 等等,您可以使用getopts解析命令行参数。开始使用时非常有用。请查看 getopts:getopts optstring名称[arg] 解析选项参数 外壳程

示例:

./myscript --ip 192.168.1.1 --port 1985
或其他可能的

./myscript --port 1985 --ip 192.168.1.1
我希望允许脚本以任意顺序获取一组参数

./myscript a b c d
./myscript d c b a
./myscript b d a c

等等,您可以使用
getopts
解析命令行参数。开始使用时非常有用。

请查看

getopts:getopts optstring名称[arg]
解析选项参数

外壳程序使用Getopts解析位置参数 作为选择

OPTSTRING
包含要识别的选项字母;如果有一封信 后跟冒号,该选项应具有参数, 应该用空格隔开

每次调用它时,getopts都会在 shell变量$name,初始化名称(如果不存在),以及 要处理到shell中的下一个参数的索引 变量OPTIND。每次shell或 调用一个shell脚本。当选项需要参数时, getopts将该参数放入shell变量
OPTARG

getopts以两种方式之一报告错误。如果第一个字符 OPTSTRING的值是冒号,getopts使用静默错误报告。在里面 在该模式下,不会打印错误消息。如果选择了无效选项 如图所示,getopts将找到的选项字符放在OPTARG中。如果 找不到必需的参数,getopts将“”放在名称和 将OPTARG设置为找到的选项字符。如果getopts不在 静默模式,并且看到一个无效选项,getopts将“?”放入 命名并取消OPTARG。如果找不到所需的参数,则会出现“” 放置在名称中,OPTARG未设置,并显示诊断消息 印刷品

如果shell变量
OPTERR
的值为0,则getopts将禁用 打印错误消息,即使 OPTSTRING不是冒号。OPTERR默认值为1

Getopts通常解析位置参数($0-$9),但如果 如果给出更多参数,则会对其进行解析

退出状态:
如果找到一个选项,则返回success;如果选项的结尾为,则失败 遇到错误或发生错误


这个简单的脚本使用
p
获取端口号,使用
i
参数获取ip地址

while getopts "i:p:" option; do case $option in i ) ip_address=$OPTARG echo "ip address: $ip_address" ;; p ) port_number=$OPTARG echo "port number: $port_number" ;; esac done 也如在

请注意,getopts无法解析GNU样式的长选项(-myoption)或XF86样式的长选项(-myoption)

因此,不能直接使用长字符串作为
--port
--ip
getopts
。 但是,如本链接所述,还有其他解决方法:

通常,IP和端口在一个参数中指定:
192.168.1.1:1985
@mouviciel我同意,但这只是为了演示 ip address: 192.168.1.1 port number: 1985