我有一个使用getopt来解析其参数的bash脚本。它正确处理开关和长选项,以及参数和引用参数,但我无法弄清楚如何迭代反引号返回的选项/参数字符串。类似的东西:
params=`getopt -o ab -l ccc -- "$@"`
echo $params
for param in "$params"
do
echo $param
done
当脚本被调用为-a -- 'foo' 'foo bar'
时,将回显./a.sh -a foo "foo bar"
,但是循环而不是分别遍历每个循环只会在整个字符串上运行一次。删除双引号:
for param in $params
将导致它像这样迭代:
-a
--
'foo'
'foo
bar'
忽略“foo bar”周围的引用。有没有一种简单的方法来解决这个问题?
答案 0 :(得分:2)
从getopt手册页(至少是util-linux one:)
getopt(1)的传统实现无法应对 参数中的空格和其他(特定于shell)特殊字符 和非选项参数。为了解决这个问题,这个实现 可以生成必须再次被解释的引用输出 shell(通常使用eval命令)。这有预先的效果 提供这些字符,但你必须以一种不这样的方式调用getopt 更长时间与其他版本兼容(第二或第三种格式) 大概)。确定是否增强版本的getopt(1) 安装后,可以使用特殊的测试选项(-T)。
示例:
$ getopt -- 'abc' -a -b 'foo bar' -c
-a -b -c -- 'foo bar'
因此,您可以看到输出已被引用,可供使用:
$ eval set -- "`getopt -- 'abc' -a -b 'foo bar' -c`"
$ for a; do echo "arg: $a"; done
arg: -a
arg: -b
arg: -c
arg: --
arg: foo bar
答案 1 :(得分:0)
查看bash
内置getopts
。
此外,有关使用getopt
的一个很好的示例,请参阅this script。