【问题标题】:bash script parameters [duplicate]bash脚本参数[重复]
【发布时间】:2010-10-24 02:12:11
【问题描述】:

我需要编写一个bash脚本,并希望它能够解析无序参数的格式:

scriptname --param1 <string> --param2 <string> --param3 <date>

有没有一种简单的方法可以做到这一点,还是我几乎坚持使用 1 美元、2 美元、3 美元?

【问题讨论】:

    标签: bash scripting parameters


    【解决方案1】:

    你想要getopts。

    【讨论】:

    • getopts 不支持长开关(以 -- 开头)。 getopt 可以,但是使用/读取非常可怕
    • 好点 - 如果长开关是必须具备的,getopts 不是正确的工具。
    • 这个答案会更好的内容和/或示例,而不仅仅是一个链接。
    【解决方案2】:
    while [[ $1 = -* ]]; do
        arg=$1; shift           # shift the found arg away.
    
        case $arg in
            --foo)
                do_foo "$1"
                shift           # foo takes an arg, needs an extra shift
                ;;
            --bar)
                do_bar          # bar takes no arg, doesn't need an extra shift
                ;;
        esac
    done
    

    【讨论】:

    • 不应该 do_foo "$2" 是 do_foo "$1" 吗?
    • @xx77aBs 是的,应该!
    【解决方案3】:

    mcurl 是一个很好的例子,说明如何并排实现短开关和长开关:

    http://www.goforlinux.de/scripts/mcurl/

    【讨论】:

      【解决方案4】:

      如前所述,Bash 有一个 getops 函数,它可能会解决您的问题。

      如果您需要更复杂的东西,bash 还支持位置参数(顺序为 $1 ... $9,然后 ${10} .... ${n}),您必须提出自己的逻辑来处理这个输入。一种简单的方法是在 for 循环中放置一个 switch/case,迭代参数。您可以使用处理输入的两个特殊 bash 变量之一:$* or $@。

      【讨论】:

        【解决方案5】:
        #!/bin/bash
        
        # Parse the command-line arguments
        while [ "$#" -gt "0" ]; do
          case "$1" in
            -p1|--param1)
              PARAM1="$2"
              shift 2
            ;;
            -p2|--param2)
              PARAM2="$2"
              shift 2
            ;;
            -p3|--param3)
              PARAM3="$2"
              shift 2
            ;;
            -*|--*)
              # Unknown option found
              echo "Unknown option $1."
        
              exit 1
            ;;  
            *)
              CMD="$1"
              break
            ;;
          esac
        done 
        
        
        echo "param1: $PARAM1, param2: $PARAM2, param3: $PARAM3, cmd: $CMD"
        

        当我执行这个时:

        ./<my-script> --param2 my-param-2 --param1 myparam1 --param3 param-3 my-command
        

        它输出你所期望的:

        param1: myparam1, param2: my-param-2, param3: param-3, cmd: my-command
        

        【讨论】:

          猜你喜欢
          • 2013-08-24
          • 2019-04-09
          • 1970-01-01
          • 2017-11-29
          • 2018-05-22
          • 2021-03-05
          • 2020-04-02
          相关资源
          最近更新 更多