2016-11-15 4 views
-2

мне нужно получить код в Баше, который даст мне текущую дату в следующем формате:формата дата в Баше - случаи

Sunday, 1^st January 2016 (с верхним индексом st, nd, rd или th) в 4 случаях.

Каков способ получения надстрочного индекса?

Буду благодарен за любую помощь.

+0

Посмотрите здесь это может быть полезно: http://stackoverflow.com/questions/13627308/add-st-nd-rd-and-th-ordinal-suffix-to-a-number – DimaSan

+1

Немного сурово, что ваш вопрос проголосовали, потому что вы новичок, однако, к сожалению, пользователи, которые это сделали, имели определенную причину. В следующий раз попробуйте включить некоторые примеры кода о том, что вы пробовали до сих пор. Или попробуйте написать более явные вопросы вместо одного неявного .: 1. Как я могу получить только день месяца в bash? 2. Как написать условные утверждения? 3. Как я могу заменить соответствие в строках – atevm

+0

Боюсь, невозможно напечатать надстрочные версии этих символов в терминале, по крайней мере, переносимым образом. –

ответ

0

Я надеюсь, что это помогает:

#!/bin/bash 

# get the day of the month to decide which postfix should be used 
dayOfMonth=$(date +%d) 

# Choose postfix 
case "$dayOfMonth" in 
    1) 
    postfix="st" 
    ;; 
    2) 
    postfix="nd" 
    ;; 
    3) 
    postfix="rd" 
    ;; 
    *) 
    postfix="th" 
    ;; 
esac 

# Generate date string 
myDate=$(date +%A,\%d\^$postfix\ %B\ %Y) 
echo $myDate 

Пояснение:

  1. ум комментарии.

  2. Выход команды даты может быть отформатирован из командной строки со строкой, начинающейся с «+», содержащей параметры формата varius, такие как% d для дня месяца.

Введите это в терминале:

дата человек

, чтобы получить инструкции и проверьте раздел FORMAT.

Или если вы хотите запустить приложение в полночь, когда Тоби Спейт предупредил об этом. дата вызова только один раз:

#!/bin/bash 

# Generate date template 
dateTpl=$(date +%A,\ \%d\^postfix\ %B\ %Y) 
# get the day of the month from the template, to decide which postfix should be use 
dayOfMonth=$(echo $dateTpl | cut -d ' ' -f 2 | sed 's/\^postfix//g') 

# Choose postfix 
case "$dayOfMonth" in 
    1) 
    postfix="st" 
    ;; 
    2) 
    postfix="nd" 
    ;; 
    3) 
    postfix="rd" 
    ;; 
    *) 
    postfix="th" 
    ;; 
esac 

# Generate date string from template 
myDate=$(echo $dateTpl | sed "s/postfix/$postfix/g") 
echo $myDate 
0

Программа date не имеет каких-либо преобразований, которые производят порядковые номера, так что вам нужно заменить суффикс за его пределами:

#!/bin/bash 

d=$(date +%e) 

case $d in 
    1?) d=${d}th ;; 
    *1) d=${d}st ;; 
    *2) d=${d}nd ;; 
    *3) d=${d}rd ;; 
    *) d=${d}th ;; 
esac 

date "+%A, $d %B %Y" 

Обратите внимание, что большинство английский руководства по стилю рекомендуют не записывать порядковый суффикс в качестве надстрочного индекса; если вы действительно настаиваете на этом, вы можете рассматривать это как упражнение!


Заметим также, что при вызове date дважды, мы рискуем состояние гонки в полночь. Мы можем избежать этого отдельно найти текущее время и затем форматирование:

#!/bin/bash 

s=$(date [email protected]%s) 
d=$(date -d $s +%e) 

case $d in 
    1?) d=${d}th ;; 
    *1) d=${d}st ;; 
    *2) d=${d}nd ;; 
    *3) d=${d}rd ;; 
    *) d=${d}th ;; 
esac 

date -d $s "+%A, $d %B %Y" 

В качестве альтернативы, прочитать дату (один раз) в отдельные переменные, а затем отформатировать их в скорлупе:

#!/bin/bash 

IFS=_ read a d b y < <(date +%A_%e_%B_%Y) 

case $d in 
    1?) d=${d}th ;; 
    *1) d=${d}st ;; 
    *2) d=${d}nd ;; 
    *3) d=${d}rd ;; 
    *) d=${d}th ;; 
esac 

echo "$a, $d $b $y" 
Смежные вопросы