2012-04-11 40 views

Trả lời

16

Hãy thử điều này:

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

echo ${MONTHS[3]} 

Hoặc theo gợi ý @ Potong của (có một sự tương ứng 1-1 giữa số tháng và chỉ số)

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

echo ${MONTHS[4]} 
+0

Tôi chọn câu trả lời này vì nó đơn giản hơn –

+6

Có thể 'MONTHS = (dummy Jan Feb Mar Apr May Jun Jul Aug Sep Oct December Dec)' sẽ trực quan hơn khi đó là '4' map thành' Apr'. – potong

+0

@potong +1 Thật vậy ... ;-) –

12
#! /bin/bash 
case $1 in 
    [1-9]|1[0-2])  date -d "$1/01" +%b ;; 
    *)   ; exit 1 
esac 
+1

Tại sao downvote? Có gì sai với câu trả lời này? –

+1

Tôi đồng ý, tôi không biết có gì sai với cách tiếp cận này. –

+1

Tôi tự hỏi là tốt. –

4

một lo kết quả nhạy cảm với cale có thể đạt được như thế này; đặt số vào vị trí tháng của ngày, được chuyển thành ngày được xuất cho đến ngày và chọn một năm và ngày tùy ý (tránh xa 50 năm và tương lai xa và tránh ngày lớn hơn 20). Nó đã không phải là năm thực tế:

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

Ở đây, với locale de_DE, tôi nhận được kết quả:

Okt 

(Tôi đã không chọn tháng Tư, bởi vì nó là mặc định cho ngày để lấy tháng hiện tại, vì vậy với một định dạng d -date xấu, bạn nhận được tháng Tư, ngay cả khi tôi = 10. Tôi biết điều đó, bởi vì tôi đã trải nghiệm nó. Và hơn nữa: Tên tiếng Đức cho tháng Tư là tháng Tư, vì vậy nó sẽ không ' t phục vụ tốt làm ví dụ cho các chi tiết tốt hơn, chỉ theo sau bây giờ :)

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

điều này cho thấy tháng theo phong cách tiêu chuẩn quốc tế.

Lợi thế của giải pháp là, nó sẽ tồn tại các cuộc cách mạng, đổi tên các tháng thành Brumaire, Obamer hoặc quốc tế hóa (Mär, Mai, Okt, Dez bằng tiếng Đức, tức là).

Các vấn đề liên quan