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
この提案はdate
12回ではなく一度だけ実行されます。
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