Вопрос по bash – Bash: Как преобразовать число в строку месяца?

8

Я хочу отобразить, например, 4 на «апрель»; (Трехбуквенное сокращение названия месяца)

Ваш Ответ

3   ответа
14
#! /bin/bash
case $1 in 
  [1-9]|1[0-2])     date -d "$1/01" +%b ;;
  *)            ;  exit 1
esac
Я согласен, я не знаю, что не так с этим подходом.
Почему отрицательный голос? Что не так с этим ответом?
Мне тоже интересно. Anthony Kong
4

Чувствительный к локали результат может быть получен как это; поместите число в позицию даты месяца, переданную в качестве даты для вывода на дату, и выберите произвольный год и день (держитесь подальше от 50-х годов и далекого будущего и избегайте дней, намного превышающих 20). Это не фактический год:

i=10; date -d 2012/${i}/01 +%b

Здесь, с локалью de_DE, я получаю результат:

Okt

(Я не выбирал апрель, потому что это дата по умолчанию для текущего месяца, поэтому при неверно отформатированной -d -date вы получите апрель, даже если я = 10. Я знаю это, потому что испытал его. И более того: немецкое название апреля - апрель, так что оно не будет хорошим примером для более мелких деталей, которые следуют только сейчас :)

i=10; LC_ALL=C date -d 2012/${i}/01 +%b

это показывает месяц в стиле международного стандарта.

Преимущество этого решения состоит в том, что оно переживет революции, которые переименуют месяцы в Brumaire, Obamer или попытки интернационализации (M?, Mai, Okt, Dez на немецком языке, т.е.).

18

Try this :

MONTHS=(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)

echo ${MONTHS[3]}

Or as per @potong's suggestion (to have a 1-1 correspondence between month number and index)

MONTHS=(ZERO Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)

echo ${MONTHS[4]}
@potong +1 Действительно ... ;-)
Может бытьMONTHS=( dummy Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) будет более интуитивным, как тогда4 карты дляApr.
Я выбираю этот ответ, потому что он проще Anthony Kong
@potong Вот что я сделал. ура Anthony Kong

Похожие вопросы