bashを使用して月のリストを生成する方法は?

bashを使用して月のリストを生成する方法は?

bashを使用してプログラムで年の完全な月名を生成するには?

答え1

locale現在のロケールの月名を教​​えてくれます。

locale mon

したがって:

$ LC_TIME=en_GB.UTF-8 locale mon
January;February;March;April;May;June;July;August;September;October;November;December

$ LC_TIME=fr_FR.UTF-8 locale mon
janvier;février;mars;avril;mai;juin;juillet;août;septembre;octobre;novembre;décembre

月を別々の行に表示するには、出力をtr ';' '\n'

答え2

おそらくbashに制限するつもりはありませんが…可能です。

使用ただbash、しかしbash 4.2以上(サポート用printf %(fmt)T)、1日の秒数だけを仮定します(うるう秒は安全でなければなりませんが)。

#!/bin/bash
now=$(printf '%(%s)T' -1)
thism=$(printf '%(%B)T' "$now")
nextm=$thism
s=$now
until [[ "$thism" != "$nextm" ]]
do
  s=$((s+86400))
  nextm=$(printf '%(%B)T' "$s")
done
printf '%(%B)T\n' "$s"

while [[ "$thism" != "$(printf '%(%B)T' "$s")" ]]
do
  while [[ "$(printf '%(%B)T' "$s")" == "$(printf '%(%B)T' $((s + 86400)))" ]]
  do
    s=$((s+86400))
  done
  s=$((s+86400))
  printf '%(%B)T\n' "$s"
done

初期割り当ては現在時刻を秒単位で設定し、「今月」変数は現在月に初期化され、「秒」変数は現在時刻(秒)に初期化されます。

最初のループは、「seconds」変数をその日付の秒数だけ増やし、今月から外します。今月の終わりに、新しい月の名前を印刷します。

2番目のループは、現在の月が再発見されるまで年を通過します。そのループ内の内部ループは、その月の最後の日まで「秒」を増やします。内部ループが完了した後に日を増やし、新しい月の名前を印刷します。その後、外部(2番目)のループが継続的に完了します。

答え3

私はこのlocale提案を好みますが、GNUがそれを実装すると仮定すると、dateこの提案はdate12回ではなく一度だけ実行されます。

printf "%02d/01/2000\n" {1..12} | LC_ALL=C date +%B -f-
January
February
March
April
.
.
.

答え4

FreeBSDを使用して実装されていますdate(Macosでも利用可能):

for i in 1 2 3 4 5 6 7 8 9 10 11 12
  do 
    date -v"$i"m +%B
  done 

関連情報