计算bash数组中不以特定字符开头的元素

时间:2013-03-24 19:13:49

标签: bash

我正在尝试编写一个bash脚本来计算数组中不以字符' - '开头的所有元素(它是shell-completion脚本的一部分,它计算参数而不是{中的选项) {1}}数组)。 与我正在尝试编写的Python相当的是:

words

我编写了一些工作正常的代码,但由于我对bash脚本很新,我确信可以做一些改进,我想知道我是否错过了一些更好的实现方法涉及如此多的代码行,可能看起来更像Python实现?

这就是我所拥有的:

len([word for word in words if not word.startswith("-")])

欢迎任何改进。

2 个答案:

答案 0 :(得分:1)

我用

for word in "${words[@]}"

即使某些参数包含空格也应该有效。另外,您可以使用普通模式匹配代替正则表达式:

if [[ $word != -* ]] ; then

除此之外,我什么也没看到。 Bash并不像Python或Perl那样简洁。

答案 1 :(得分:0)

您还可以使用grep为您计算行数:

$ words=('a' 'b' '-c' 'd' '--foo' 'e')
$ argcount=$( printf "%s\n" "${words[@]}" | grep -vc "^-" )

(假设words中的任何单词都不能包含嵌入的换行符,这似乎是一个足够安全的假设。)

如果你必须使用纯bash,并且不想像choroba建议的那样使用模式,你可以否定正则表达式匹配的结果:

if ! [[ $word =~ ^- ]]; then
    (( argcount++ ))
fi