![Bash getopts 在第一个参数之后采用更多位置参数](https://linux22.com/image/155912/Bash%20getopts%20%E5%9C%A8%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8F%82%E6%95%B0%E4%B9%8B%E5%90%8E%E9%87%87%E7%94%A8%E6%9B%B4%E5%A4%9A%E4%BD%8D%E7%BD%AE%E5%8F%82%E6%95%B0.png)
所以我不知道如何制作 getopts 以便它获取参数后的每个位置参数。
我的意思如下:这是我的示例代码:
#!/bin/bash
while getopts 'a:b:' thing_here; do
case $thing_here in
a) part_1="${OPTARG}" ;;
b) part_2="${OPTARG}" ;;
*) echo "invalid option, quitting"
exit 1 ;;
esac
done
echo "part 1 = ${part_1}"
echo "part 2 = ${part_2}"
现在我想要的是以下内容: 输入:
$: ./example_script.sh -a asd qwe zxc -b dfg 213
输出:
part 1 = asd qwe zxc
part 2 = dfg 213
但我实际得到的是以下内容:
part 1 = asd
part 2 =
现在我知道我可以通过将参数括起来来完成我想做的事情:
$: ./example_script.sh -a 'asd qwe zxc' -b 'dfg 213'
但我试图找到的是如何在脚本和 getopts 本身中执行此操作,而不必自己添加引号(对于某些自动化来说更容易)。
答案1
如果您不想将参数括在引号中(最简单且最强大的解决方案),那么您不能使用getopts
,并且您必须将某些内容组合在一起,例如:
declare -A args
key=""
for arg; do
case $arg in
"-a") key=part_1 ;;
"-b") key=part_2 ;;
*) [[ -n $key ]] || { echo "unexpected argument" >&2; exit 1; }
args[$key]="${args[$key]}$arg "
;;
esac
done
# turn the array keys into variables
for key in "${!args[@]}"; do declare "$key=${args[$key]% }"; done
echo "part 1 => $part_1"
echo "part 2 => $part_2"
根据您的要求,您不能使用getopt
其中任何一个。假设您有 GNU getopt,看看会发生什么:
$ set -- -a asd qwe zxc -b dfg 213
$ getopt -o a:b: -- "$@"
-a 'asd' -b 'dfg' -- 'qwe' 'zxc' '213'
仅获取选项后的第一个单词作为选项的参数。
我再说一遍,采取简单的路线并确保引用论点。