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