0

文字「-」で始まらない配列内のすべての要素をカウントするbashスクリプトを作成しようとしています(これは、words配列内のオプションではなく、引数をカウントするシェル完了スクリプトの一部です)。私が書き込もうとしているものと同等の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 "^-" )

(単語が埋め込まれていないと仮定すると、words改行が埋め込まれる可能性があります。これは十分に安全な仮定のようです。)

純粋なを使用する必要がありbash、chorobaが示唆するようにパターンを使用したくない場合は、正規表現の一致の結果を無効にすることができます。

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