在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 name [arg]
解析选项参数

shell过程使用

Getopts来解析位置参数作为选项。

OPTSTRING 包含要识别的选项字母;如果是一封信后面跟一个冒号,则该选项应该有一个参数,

每次调用它时,getopts将把下一个选项放在Shell变量$name,如果不存在则初始化它要在shell中处理的下一个参数的索引变量OPTIND。OPTIND初始化为1调用shell脚本。当一个选项需要一个参数时,getopts将该参数放入shell变量 OPTARG

getopts以两种方式之一报告错误。如果第一个字符的值是冒号,getopts使用静默错误报告。在在这种模式下,不打印错误信息。如果无效选项为可见,getopts将找到的选项字符放入OPTARG中。如果一个没有找到所需的参数,getopts将':'放入NAME和将OPTARG设置为找到的选项字符。如果getopts不在沉默模式,并且看到一个无效的选项,getopts位置'?"成NAME并取消OPTARG设置。如果没有找到所需的参数,则使用'?"放在NAME中,OPTARG未设置,诊断消息为打印出来。

如果shell变量 OPTERR 的值为0,则getopts禁用的第一个字符打印错误消息OPTSTRING不是冒号。OPTERR的默认值为1。

Getopts通常解析位置参数($0 - $9),但是if如果给出更多的参数,它们将被解析。

退出状态:
如果找到一个选项,返回成功;如果options的结尾为遇到或发生错误。

您可以使用getopts来解析命令行参数。本教程对于开始使用

非常有用

这个简单的脚本使用带有p的端口号和带有i参数的ip地址。

<>之前而getopts "i:p:"选项;做Case $option ini) ip_address=$OPTARGEcho "ip address: $ip_address";;p) port_number=$OPTARG回显"端口号:$port_number";;esac完成之前

可以通过以下两种方式执行:

./myscript -i 192.168.1.1 -p 1985

./myscript -p 1985 -i 192.168.1.1

执行时输出:

<>之前IP地址:192.168.1.1端口号:1985之前

也如http://wiki.bash-hackers.org/howto/getopts_tutorial

所述

请注意,getopts不能解析gnu风格的长选项(——myoption)或xf86风格的长选项(-myoption)

所以你不能使用长字符串作为--port--ip直接与getopts。然而,如此链接所述,还有其他解决方案:
http://www.bahmanm.com/blogs/command-line-options-how-to-parse-in-bash-using-getopt

最新更新