私のスクリプトでは、毎月最初の土曜日の日付を取得する必要があります。以下のコマンドで最後の土曜日の日付を取得できます。
date -d 'last Saturday' +%y%m%d
しかし、最初の土曜日の約束を取ることができませんでした。試してみましたが、 date -d 'First Saturday' +%y%m%d
期待した結果は得られませんでした。
たとえば、私の要件は - 今月(7月) - 最初の土曜日の日付(200704)です。
誰もが毎月最初の土曜日の日付を知るのに役立ちますか?
答え1
そしてksh93
:
$ ksh93 -c 'printf "%(%y%m%d)T\n" "first saturday"'
200704
答え2
強く打つ
インデントされたコマンドは理解を助けるためのものです。
$ target_day_id=6 # return value of date +%w; Sunday is 0
$ year_month="$(date +%Y-%m)"
$ echo $year_month
2020-07
$ day_id="$(date --date="${year_month}-01" +%w)"
$ echo $day_id
3
$ # July, 1st 2020 was a Wednesday
$ sat1_date="${year_month}-0$(( ( (7+target_day_id-day_id) % 7 ) + 1 ))"
$ echo $sat1_date
2020-07-04
$ # only formatting from now on
$ sat1_date_short="${sat1_date:2}"
$ echo $sat1_date_short
20-07-04
$ sat1_date_short_digits_only="${sat1_date_short//-/}"
$ echo $sat1_date_short_digits_only
200704
答え3
GNU日付とシェルループの使用:
day=1
until [ $(date +%A -d $(date +%Y-%m-$(printf '%02d' "$day"))) = "Saturday" ]
do
((day++))
done
date +%y%m$(printf '%02d' "$day")
これは、「day」変数を1に初期化してその月の最初の日を表示し、その日の名前が土曜日になるまで毎日繰り返されます。この-d
フラグを使用して「現在」以外のタイムスタンプを使用するには、GNU日付が必要です。ループテストは次のように分類されます。
[ $(date +%A ...) = "Saturday" ]
- 日付(現在のロケールの完全な曜日名を求める)出力を「Saturday」と比較します。date ... -d $(date +%Y-%m-$(printf '%02d' "$day"))
- この日付コマンドに表示する日付を指定します(現在時刻を使用しません)-d
。日付は、2番目の内部日付コマンドから生成されます。内部日付コマンドが印刷されます。現在時刻%Y は現在の年であり、%m は現在の月である %Y-%m-(日) 形式を使用してループ変数 "day" を渡します。最も内側の printf ステートメントは、単に日付フィールドが 0 で 2 文字で埋められていることを確認します。
最後に、計算された土曜日を使用して、現在の年と月を希望の形式で印刷します。