次のスクリプト:
N=5
BUSINESS_DATE=`date -d "-2 day" +"%Y%m%d"`
for (( c=0; c<N ; c++ ))
do
WEEKDAY=`date --date="$BUSINESS_DATE -$c day" +%w`
if [ $WEEKDAY == "0" ]
then
FILE_DT_TMP=`date --date="$BUSINESS_DATE -$c day-2day" +%Y%m%d`;
elif [ $WEEKDAY == "6" ]
then
FILE_DT_TMP=`date --date="$BUSINESS_DATE -$c day -2day" +%Y%m%d`;
elif [ $WEEKDAY == "5" ]
then
FILE_DT_TMP=`date --date="$BUSINESS_DATE -$c day -2day" +%Y%m%d`;
elif [ $WEEKDAY == "4" ]
then
FILE_DT_TMP=`date --date="$BUSINESS_DATE -$c day -2day" +%Y%m%d`;
elif [ $WEEKDAY == "3" ]
then
FILE_DT_TMP=`date --date="$BUSINESS_DATE -$c day -2day" +%Y%m%d`;
elif [ $WEEKDAY == "2" ]
then
FILE_DT_TMP=`date --date="$BUSINESS_DATE -$c day -2day" +%Y%m%d`;
elif [ $WEEKDAY == "1" ]
then
FILE_DT_TMP=`date --date="$BUSINESS_DATE -$c day -2day" +%Y%m%d`;
else
FILE_DT_TMP=`date --date="$BUSINESS_DATE -$c day" +%Y%m%d`
fi
export FILE_DT=$FILE_DT_TMP
echo "File date is :$FILE_DT"
done
適切な出力が得られません。何が問題で、どうすれば修正できるのか、どなたかアドバイスをいただけませんか?
答え1
今日から 5 営業日前だけを希望する場合は、次を試してください。
for d in Mon Tue Wed Thu Fri
do
date +%Y%m%d -d "last $d"
done | sort
今日より前のN日間の場合:
N=10
for i in $(seq $(($N + $N / 5 * 2)) -1 1)
do
[ `date --date="-$i day" +%u` -le 5 ] &&
date -d "-$i day" +"File date is : %Y%m%d"
done
答え2
質問に示されているハードコードされた 5 日ではなく、実際には N 日をリストする必要があると理解しています。bash
この要件に対応するソリューションは次のとおりです。
n=5
today=$(date +'%Y-%m-%d')
for ((d=1; n>0; d++))
do
# Adjust this next line to get the date format you require, e.g. +'%Y%m%d'
date=$(date --date "$today -$d day")
nday=$(date --date "$today -$d day" +'%w')
if [[ nday > 0 && nday < 6 ]]
then
# Adjust this next line to output whatever you really need
echo "n=$n, d=$d, nday=$nday, date=$date: WEEKDAY"
((n--))
fi
done
n=5
2015 年 11 月 5 日に実行されたの出力
n=5, d=1, nday=3, date=Wed, 4 Nov 2015 00:00:00: WEEKDAY
n=4, d=2, nday=2, date=Tue, 3 Nov 2015 00:00:00: WEEKDAY
n=3, d=3, nday=1, date=Mon, 2 Nov 2015 00:00:00: WEEKDAY
n=2, d=6, nday=5, date=Fri, 30 Oct 2015 00:00:00: WEEKDAY
n=1, d=7, nday=4, date=Thu, 29 Oct 2015 00:00:00: WEEKDAY
答え3
これらの変更をスクリプトに適用すると、次のようになります。
1c1
< BUSSINESS_DATE=date -d "-2 day" +"%Y%m%d"
---
> BUSSINESS_DATE=$(date -d "-2 day" +"%Y%m%d")
5c5
< WEEKDAY=date --date="$BUSSINESS_DATE -$c day" +%w
---
> WEEKDAY=$(date --date="$BUSSINESS_DATE -$c day" +%w)
次のような出力が得られます:
File date is :20151101
File date is :20151031
File date is :20151030
File date is :20151029
File date is :20151028
それがあなたが探しているものですか?
答え4
うわー、それは非常に読みにくいですね。if/then/elif/else/fi の代わりに case 文を使ってみてください。
例えば
BUSSINESS_DATE=$(date -d "-2 day" +"%Y%m%d")
for (( c=0; c<5 ; c++ )) ; do
WEEKDAY=$(date --date="$BUSSINESS_DATE -$c day" +%w)
case "$WEEKDAY" in
0) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day-2day" +%Y%m%d) ;;
6) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day -2day" +%Y%m%d) ;;
5) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day -2day" +%Y%m%d) ;;
4) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day -2day" +%Y%m%d) ;;
3) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day -2day" +%Y%m%d) ;;
2) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day -2day" +%Y%m%d) ;;
1) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day -2day" +%Y%m%d) ;;
*) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day" +%Y%m%d) ;;
esac
export FILE_DT=$FILE_DT_TMP
echo "File date is :$FILE_DT"
done
day
読みやすくするためにフォーマットし直すと、ケースのと-2day
の間にスペースがないことがはっきりとわかります0
。簡単に修正できます。
0) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day-2 day" +%Y%m%d) ;;
ところで、もし私があなただったら、変数名をもっと短くして(そして、変数を最初に使用する前に、それが何であるかを明確に示すコメントを追加して)、行の折り返しを避けてスクリプトをさらに読みやすくします。
例: BUSINESS_DATEをBDに変更
# BD is Business Date
BD=$(date -d "-2 day" +"%Y%m%d")
FILE_DT_TMP
FDT
は、 、またはFILE_DT
に名前を変更できます。FD
FDATE
BD=$(date -d "-2 day" +"%Y%m%d")
for (( c=0; c<5 ; c++ )) ; do
WEEKDAY=$(date --date="$BD -$c day" +%w)
case "$WEEKDAY" in
0) FDT=$(date --date="$BD -$c day -2day" +%Y%m%d) ;;
6) FDT=$(date --date="$BD -$c day -2day" +%Y%m%d) ;;
5) FDT=$(date --date="$BD -$c day -2day" +%Y%m%d) ;;
4) FDT=$(date --date="$BD -$c day -2day" +%Y%m%d) ;;
3) FDT=$(date --date="$BD -$c day -2day" +%Y%m%d) ;;
2) FDT=$(date --date="$BD -$c day -2day" +%Y%m%d) ;;
1) FDT=$(date --date="$BD -$c day -2day" +%Y%m%d) ;;
*) FDT=$(date --date="$BD -$c day" +%Y%m%d) ;;
esac
FDATE="$FDT"
echo "File date is : $FDATE""
done
このようにコードを再フォーマットすることには、実際に利点があります。整列するはずのものが整列していないと、点滅するネオンサインのように目立つのです。
その他の注意事項:
すべてのバックティックを に変更しました
$()
。バックティックは廃止されており、引用符を台無しにするので、使用しないでください。FILE_DT (別名 FDATE) をエクスポートする必要はありません。変数は、実行されているサブシェルが終了すると失われます。スクリプトを でソース化した場合にのみ、親シェルに設定されます
. scriptname
。