在bash中,我如何以任意随机顺序拥有一组参数?像一对键值对?

时间:2011-09-23 12:02:42

标签: 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

Etcetera

3 个答案:

答案 0 :(得分:12)

看看getopts

  

getopts :getopts optstring name [arg]
     解析选项参数。

     

shell程序使用Getopts来解析位置参数       作为选项。

     

OPTSTRING 包含要识别的选项字母;如果一封信       后跟一个冒号,期望有一个参数,       白色空间应该与它分开。

     

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

     

getopts以两种方式之一报告错误。如果是第一个字符       OPTSTRING是一个冒号,getopts使用无提示错误报告。在       此模式下,不会打印任何错误消息。如果选项无效       看到,getopts将选项字符放入OPTARG中。如果一个       找不到必需的参数,getopts将一个''放入NAME和       将OPTARG设置为找到的选项字符。如果没有getopts       静默模式,看到无效选项,getopts放置'?'成       NAME并取消设置OPTARG。如果找不到必需的参数,则为“”       放置在NAME中,取消设置OPTARG,并显示诊断消息       打印。

     

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

     

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

     

退出状态
     如果找到选项,则返回成功;如果选项结束,则失败       遇到或发生错误。

答案 1 :(得分:8)

您可以使用getopts来解析命令行参数。 This tutorial对于开始使用非常有用。

答案 2 :(得分:4)

这个简单的脚本使用带有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

可以以任何一种方式执行:

./myscript -i 192.168.1.1 -p 1985

./myscript -p 1985 -i 192.168.1.1

执行时打印:

ip address: 192.168.1.1
port number: 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