2013-03-24 63 views
0

我正在尝试编写一个bash脚本,用于统计数组中所有不以' - '开头的元素(它是一个shell的一部分) - 完成脚本,用于统计参数,而不是words阵列中的选项)。 一个Python相当于什么,我试着写为:bash数组中的元素不以特定字符开头

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

我写了一些代码,工作正常,但因为我很新打坏的脚本,我敢肯定,一些可以改进,我想知道如果我错过了一些更好的方法来实现这个不涉及太多的代码行,也许看起来更像Python实现?

这是我有:

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

任何改善是值得欢迎的。

回答

1

我会使用

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

应该工作,即使一些参数包含空格。此外,您可以使用正常模式匹配来代替正则表达式:

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

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

0

您还可以使用grep计数线为您提供:

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

(在words假设没有词可以包含嵌入的换行符,这似乎是一个足够安全的假设。)

如果您必须使用纯粹的bash,并且不希望按照choroba的建议使用模式,可以否定正则表达式匹配的结果:

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