現在の日付から四半期の最初と最後の日を計算する必要があるシェルスクリプトを作成しています。これは、スクリプト内でトリガーされるIngres 10 SQL文に適用されます。 Ingres は ksh を使用して Solaris サーバーで実行されます。
だから今日が2017年1月31日なら、次のように計算したいと思います。
- 今四半期の最初の日付(2017年1月1日)
- 今四半期の最終日(2017年3月31日)です。必要に応じて、独自の日付をここに返すことができます(例:01/04/17)。
- 直前の四半期の最初の日付(01/10/16)
- 前四半期の最終日(2016年12月31日)。 2017年1月1日の独占結果も提供されます。
誰でも助けることができますか?四半期番号の取得に関する問題を見たことがありますが、実際には役に立ちません。
以下を試しましたが、変数がCaseステートメントに埋められていないため、機能しません。
CURR_MONTH=`date +%m`
echo "Current month num = $CURR_MONTH"
CURR_YEAR=`date +%Y`
echo "Current year = $CURR_YEAR"
let "LAST_YEAR = $CURR_YEAR - 1"
echo "Last year = $LAST_YEAR"
case $CURR_MONTH in
05) CURR_Q_FROM = 01.04.${CURR_YEAR}
CURR_Q_TO = "30.06.${CURR_YEAR}"
PREV_Q_FROM = "01.01.${CURR_YEAR}"
PREV_Q_TO = "31.03.${CURR_YEAR}" ;;
esac
echo "Current Q From = $CURR_Q_FROM"
echo "Current Q To = $CURR_Q_TO"
echo "Prev Q From = $PREV_Q_FROM"
echo "Prev Q To = $PREV_Q_TO"
私は次のような結果を得ます。
Current month num = 05
Current year = 2017
Last year = 2016
Month to be extracted = April 2017
./stats_report_monthly.sh[85]: CURR_Q_FROM: not found
./stats_report_monthly.sh[86]: CURR_Q_TO: not found
./stats_report_monthly.sh[87]: PREV_Q_FROM: not found
./stats_report_monthly.sh[88]: PREV_Q_TO: not found
Current Q From =
Current Q To =
Prev Q From =
Prev Q To =
答え1
使用ksh93
(/bin/sh
Solaris 11でも同様):
#! /usr/bin/ksh -
eval "$(printf '%(y=%Y m=%-m)T')"
first=$(printf '%(%F)T' "$y-$(((m-1)/3*3+1))-1")
last=$(printf '%(%F)T' "$first next 2 months last day")
echo "$first $last"
first2=$(printf '%(%F)T' "$first last 3 months")
last2=$(printf '%(%F)T' "$first2 next 2 months last day")
echo "$first2 $last2"
例:
$ ./quarter
2017-04-01 2017-06-30
2017-01-01 2017-03-31
$ faketime 2017-01-31 ./quarter
2017-01-01 2017-03-31
2016-10-01 2016-12-31
次の方法を使用します。
eval "$(date +'y=%Y m=%m')"
case $m in
(0[1-3])
echo "$y-01-01 $y-03-31"
echo "$((y-1))-10-01 $((y-1))-12-31";;
(0[4-6])
echo "$y-04-01 $y-06-30"
echo "$y-01-01 $y-03-31";;
(0[7-9])
echo "$y-07-01 $y-09-30"
echo "$y-04-01 $y-06-30";;
(*)
echo "$y-10-01 $y-12-31"
echo "$y-07-01 $y-09-30"
esac
それにもかかわらず、Bourneに似たシェルで変数を割り当てるための構文は次のとおりです。
var=value
両側にスペースはありません=
。