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), 하루의 초 수만 가정합니다(윤초가 안전해야 하지만).

#!/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" 변수를 해당 날짜의 초 수만큼 증가시켜 이번 달에서 벗어나게 합니다. 이번 달이 끝나면 새 달의 이름을 인쇄합니다.

두 번째 루프는 현재 달을 다시 찾을 때까지 연도를 통과합니다. 해당 루프 내부의 내부 루프는 해당 월의 마지막 날까지 "초"를 증가시킵니다. 내부 루프가 완료된 후 일을 증가시키고 새 달의 이름을 인쇄합니다. 그런 다음 외부(두 번째) 루프가 계속해서 완료됩니다.

답변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 

관련 정보