【问题标题】:bash Script Arguments groupingbash 脚本参数分组
【发布时间】:2015-01-24 22:50:56
【问题描述】:

我在扩展包含空格的命令行选项时遇到问题。他们没有像我期望的那样分组。如何修改以下代码(下)以获得所需的输出(下)。

function myFunction {
  while getopts "a:b:A:" optionName; do
    echo "$optionName::$OPTARG"
  done
}

#dynamic variable, cannot be hardcoded into $MY_ARGS
MY_VAR="X1=162356374 X2=432876 X3=342724"

#$MY_ARGS is useful and will be used more than once,
#so we don't want to eliminate it and replace it's usage with its value everywhere
MY_ARGS="-a 24765437643 -b '$MY_VAR' -A jeeywewueuye"

myFunction $MY_ARGS

实际输出:

a::24765437643
b::'X1=162356374

期望的输出:

a::24765437643
b::X1=162356374 X2=432876 X3=342724
A::jeeywewueuye

【问题讨论】:

    标签: bash command-line-arguments getopts


    【解决方案1】:

    存储参数列表的最佳方式是在数组中。数组可以毫无问题地处理带有空格的参数,并且您不必弄清楚如何获得引号和反斜杠恰到好处

    MY_ARGS=(-a 24765437643 -b "$MY_VAR" -A jeeywewueuye)
    
    myFunction "${MY_ARGS[@]}"
    

    数组唯一不自然的部分是扩展它们的奇怪语法:"${array[@]}"。引号、花括号和[@] 符号都很重要。

    【讨论】:

    • 不仅仅是最佳方式,它还是唯一方式。
    【解决方案2】:

    我同意数组以最好的方式回答这个问题。
    也许您不想使用数组(同事不会理解),或者您必须遵守Google Guidelines for bash(干得好,我同意超过 90%)。声称:“如果你发现除了 ${PIPESTATUS} 的赋值之外你还需要使用数组,你应该使用 Python。”。
    当您必须寻找其他解决方案时:

    一个丑陋的解决方案是改变 IFS:

    function myFunction {
      while getopts "a:b:A:" optionName; do
        echo "$optionName::$OPTARG"
      done
    }
    
    #dynamic variable, cannot be hardcoded into $MY_ARGS
    MY_VAR="X1=162356374 X2=432876 X3=342724"
    
    MY_ARGS="-a/24765437643/-b/"$MY_VAR"/-A/jeeywewueuye"
    
    IFS=/
    myFunction ${MY_ARGS}
    

    也许你想用 myFunction 做点什么

    function myFunction {
      while getopts "a:bA:" optionName; do
        case "${optionName}" in
           b) echo "${optionName}::${MY_VAR}" ;;
           *) echo "${optionName}::${OPTARG}" ;;
        esac
      done
    }
    

    或者您可以在调用 myFunction 之前将tr 空格转换为另一个字符,然后将tr 字符转换回myFunction() 中的空格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2013-10-26
      • 2021-11-04
      • 2019-04-09
      • 2020-08-31
      • 2019-11-16
      相关资源
      最近更新 更多