0

我正在尝试编写一个bash脚本来计算数组中不以字符'-'开头的所有元素(它是计算参数而不是words数组中的选项的shell完成脚本的一部分)。与我正在尝试编写的 Python 等效的是:

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

我编写了一些运行良好的代码,但由于我对 bash 脚本非常陌生,我确信可以进行一些改进,我想知道我是否错过了一些不涉及太多的更好的实现方法代码行,也许看起来更像 Python 实现?

这就是我所拥有的:

words=('a' 'b' '-c' 'd' '--foo' 'e')
argcount=0
for word in ${words[@]}
do
    if [[ $word =~ ^[^-].*$ ]] ; then
        ((argcount++))
    fi
done
echo $argcount

欢迎任何改进。

4

2 回答 2

1

我会用

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

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

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

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

于 2013-03-24T19:25:32.577 回答
0

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

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

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

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

if ! [[ $word =~ ^- ]]; then
    (( argcount++ ))
fi
于 2013-03-24T20:14:10.850 回答