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
이 제안은 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