次の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)