2016-05-17 4 views
-4

このスクリプトは、クエリを実行して日付の一覧を取得し、これらの日付に対して2つの他のクエリを実行します。 次に、数値の小さいほうを比較し、2を掛けます。 次にファイルに書き込み、合計します。 改善を提案してください。 0の数字もチェックします。次のスクリプトを最適化する方法

あなたが最も可能性の高いコードのサイズに行い、票を下に取得している
#!/bin/bash 

1>output.txt 

today=$(date +"%Y%m%d") 
FirstOfTheMonth=$(date -d "--$(($(date +%-d)-1)) day" `enter code here`+"%Y%m%d") 

echo "XXXX activity report on daily and cumulative monthly `enter code here`basis " 
#query that outputs dates to a file 
SQL query > list 
#for each date I run 2 queries 
for i in `cat list`;do 
a1=SQL query; 
b1=SQL query; 
# I compare to find out which one is the smaller number and `enter code here`multiply it by 2 

buy=${a1#-} 
sell=${b1#-} 
echo "XXX report for $yesterday month = $i " 

echo "Buy $buy" 
echo "Sell $sell" 

if [ "$buy" -lt "$sell" ]; 
then DayNumber=$[buy * 2]; 
else DayNumber=$[sell * 2]; 
fi; 
#I write all the numbers to a file since I have to sum them 
MonthNumber=`awk '{ sum += $1 } END { print sum }' `enter `enter code here`code here`DayNumber$i` 
echo "Day Number $DayNumber" 
echo "$DayNumber$i $MonthNumber$1 $yesterday" >> DayNumber$i 

echo "Day Number since $FirstOfTheMonth $MonthNumber$1" 
echo --------------------------------------------------------------------------------------- 
done 
/usr/bin/mail -s "XXXX report $today" [email protected] < `enter code here`output.txt 
+2

コードが期待通りに機能し、改善したいだけの場合は、[codereview.se]に投稿してください。 –

+0

また、パフォーマンスの最適化について言えば、(1)最適化したいものを非常に具体的に指定し、そのものと無関係なコードをすべて削除してください。 (2)日付指定のためのbashのバージョンを正確に指定する(bashインタプリタ自身の大きな改善 - おそらく、組み込み関数に頼ってGNUの日付を使うのをやめさせる) - 4.2でリリースされた) –

+0

また、ここに入力コードのプレースホルダまたはSQLクエリのプレースホルダは、あなたがここに投稿しているものが、完全でないか検証可能でないため、有効なMCVEではないことを意味します。 http://stackoverflow.com/help/mcveを参照してください。 –

答えて

0

、あなたは何をしたいの明確性の欠如、自分でその結果を得るために努力を示していない、とコードの可読性には非常に初歩的なミスチュートリアルのWeb検索で修正することができます。 Googleには、あなたが読むべきシェルスタイルのガイドがあります。

stdoutをファイルにリダイレクトする場合は、おそらく自律的に動作しています。つまり、stderrもリダイレクトする必要があります。なぜあなただ​​けのピートのため、インデントのために、この FirstOfTheMonth=$(date +%Y%m1)

をしないmonth--わからないの exec &>output.txt

初!これは私がスクリプタを打ち負かすことになります。また、非常に小さなループでない限り、私は使用しないでください。何かを意味する変数を使用してください。

while read -rd' ' month; do 
    some commands 
    if [[ $buy -lt $sell ]]; then 
     do this thing here 
    fi 
done 

Bashはセミコロンで終端されていません。行末にはBashは必要ありません。 externam []の上にinteran [[]]を使用してください。数値比較(例:-lt)を行うには、変数(「$ buy」など)を引用しないでください。あなたと同じ行をそのままにしておいてください。それは、より読みやすくする以外の目的はありません。

関連する問題