変数追加エラー[閉じる]

変数追加エラー[閉じる]

次のbashスクリプトを実行するとき:

Success: $(grep success * | grep B2B | wc -l)
etc_error: $(grep etc_error * | grep B2B | wc -l)
map_timeout: $(grep map_timeout * | grep B2B | wc -l)

success=$(grep success * | grep B2B | wc -l)
etc=$(grep etc_error * | grep B2B | wc -l)
map=$(grep map_timeout * | grep B2B | wc -l)

sum=$(($success + $etc + $map))
total=$(($success / $sum))
echo $total

エラーが発生します。

-bash: + + : syntax error: operand expected (error token is "+ ")

私のスクリプトに問題がありますか?

ベストアンサー1

これはすべてを説明しているわけではありません。変数宣言が与えられたら、値が必要です。算術拡張$、未定義の変数を導入する必要はありません。デフォルト値は 0 です。

sum=$((success + etc + map))
total=$((success / sum))
echo "$total"

理想的には、除算する前にゼロでないことを確認する必要がありますが、sum確認しなくてもsum(「構文エラー:オペランドが予想される」の代わりに「0で除算」、このアプローチでは少なくとも合理的なエラーメッセージが表示されます)、強く打つ。

あなたが受けているエラーは次のとおりです。

sum=$(($success + $etc + $map))

何らかの理由で、successおよびetcすべてmap定義されていないか空です。シェルは上記を次のように拡張します。

sum=$(( + + ))

その後、拡張しようとすると、引用した構文エラーが発生します。

これはとても驚くべきことだから

success=$(grep success * | grep B2B | wc -l)

価値を生み出すべきです...

ところで、上記の内容を次のように改善したい場合もあります。

success=$(grep success ./* | grep -c B2B)

B2Bまたはマッチングをしたい場合成功ファイル名の代わりに行:

success=$(cat ./* | grep success | grep -c B2B)

またはGNUと互換性があるかgrep

success=$(grep -h success ./* | grep -c B2B)

おすすめ記事