迭代传递给bash脚本的选项和引用/不带引号的参数

时间:2009-08-19 02:24:49

标签: bash shell

我有一个使用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”周围的引用。有没有一种简单的方法来解决这个问题?

2 个答案:

答案 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