如何使用bash生成月份列表?

eli*_*lig -1 bash date

如何使用 bash 以编程方式生成一年的完整月份名称?

Ste*_*itt 16

locale 将告诉您当前语言环境中月份的名称:

locale mon
Run Code Online (Sandbox Code Playgroud)

因此:

$ 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
Run Code Online (Sandbox Code Playgroud)

如果您希望在不同的行中显示月份,请将输出通过管道传输到tr ';' '\n'.


Rud*_*diC 5

虽然更喜欢这个locale提案,但假设 GNU 实现了date,这个提案date只会运行一次,而不是 12 次:

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


Jef*_*ler 5

您可能并不打算将其限制为 bash,但是……您可以。

使用bash,但使用 bash 4.2 或更高版本(以支持printf %(fmt)T),并且仅假设一天中的秒数(尽管它应该是闰秒安全的):

#!/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
Run Code Online (Sandbox Code Playgroud)

初始分配以秒为单位设置当前时间和当前月份;“本月”变量初始化为当前月份,“秒”变量初始化为当前时间(以秒为单位)。

第一个循环通过将“seconds”变量增加一天的秒数来使我们摆脱当前月份。一旦我们离开当前月份,打印新月份的名称。

第二个循环贯穿一年,直到我们再次找到当前月份;该循环内部的内部循环会增加“秒”,直到该月的最后一天。一旦内部循环完成,我们增加一天,然后打印新月份的名称。然后外部(第二个)循环继续完成。