2013-03-24 60 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 
相關問題