我正在尝试编写一个bash脚本来计算数组中不以字符' - '开头的所有元素(它是shell-completion脚本的一部分,它计算参数而不是{中的选项) {1}}数组)。 与我正在尝试编写的Python相当的是:
words
我编写了一些工作正常的代码,但由于我对bash脚本很新,我确信可以做一些改进,我想知道我是否错过了一些更好的实现方法涉及如此多的代码行,可能看起来更像Python实现?
这就是我所拥有的:
len([word for word in words if not word.startswith("-")])
欢迎任何改进。
答案 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