bash 脚本参数分组

bash Script Arguments grouping

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

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

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

MY_ARGS=(-a 24765437643 -b "$MY_VAR" -A jeeywewueuye)

myFunction "${MY_ARGS[@]}"

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

我同意数组以最好的方式回答了这个问题。
也许你不想使用数组(同事不会理解),或者你必须遵守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
}

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

中的空格