Как убрать лидирующие нули из вывода 'date' или избежать восьмеричной интерпретации таких десятичных чисел?

37

У меня есть это:

date +"%H hours and %M minutes"

Я использую фестиваль, чтобы сказать это ... но он говорит как: "ноль девять часов" .. Я хочу, чтобы он сказал "девять часов"!

но дата всегда дает мне 09 ... так что мне интересно, может ли bash легко превратить это в 9?

в сложном сценарии я попробовал как

printf %d 09

но не получается .. не восьмерично :(

Есть идеи?

Водолей Сила
источник
OP, ваш принятый ответ отличный - для вашего конкретного случая, но он не соответствует названию вопроса.
einpoklum - восстановить Монику
@ilkkachu, старый заголовок был ключевым для меня, когда я нашел этот вопрос и искал десятичную интерпретацию чисел в восьмеричном формате.
Муру
@ Муру, да, я подумал, что смогу вставить туда записку о восьмерике, но не придумал хорошей фразы. Вы можете изменить это, конечно, по крайней мере, вы знаете, что вы искали? Ответы и вопросы по-прежнему в основном касаются удаления начального нуля.
ilkkachu

Ответы:

49
  • В вашем случае вы можете просто отключить заполнение нулями, добавив -после %в строку формата даты:%-H

    По умолчанию дата дополняет числовые поля нулями. Следующие необязательные флаги могут следовать за «%»:

    • - (дефис) не дополняет поле
    • _ (подчеркивание) блокнот с пробелами
    • 0 (ноль) блокнот с нулями
    • ^ используйте заглавные буквы, если это возможно
    • # используйте противоположный случай, если это возможно

    См руководство по дате

  • Если вы хотите интерпретировать число в другой базе, в bash

    • Константы с ведущим 0 интерпретируются как восьмеричные числа.
    • Ведущий 0x или 0X обозначает шестнадцатеричное.
    • В противном случае числа принимают форму [base #] n, где base - это десятичное число от 2 до 64, представляющее арифметическую базу, а n - это число в этой базе.

    Итак, чтобы интерпретировать число как десятичное, используйте 10#nформу, например.10#09

    echo $((10#09*2))
    18
    

    См. Раздел « Арифметическая оценка » руководства bash.

LiuYan 刘 研
источник
2
спасибо очень подробно! Кстати, echo $((011)) $((10#011))еще один хороший пример, который выводит9 11
Aquarius Power
1
Это не работает для отрицательных чисел: lat=048 ; latd=${lat#0} ; echo $((latd-1))работает, но lat=-048 ; latd=${lat#0} ; echo $((latd-1))не работает.
Луис А. Флорит
plus=$((10#01))
Доктор Беко,
2

Если вы пытаетесь сделать сравнение в десятичном формате со значениями даты, я нашел этот метод очень эффективным:

let mymin=$(date '+1%M') ; let mymin=$mymin%100

Это всегда дает десятичное значение. Так что я могу сделать это:

if [[ $mymin -le 1 ]]; then   # only 0 and 1 are true.

Там нет проблем с 08 или 09 таким образом. Использование% 10 вместо% 100 дает десятиминутные диапазоны от 0 до 9. Я также обнаружил, что следующее дает десятичные значения без начальных нулей:

echo "$((10#$(date +%M)))"
Дикстер
источник
2

Портативно, вы можете легко удалить ведущий 0из переменной. Это оставляет переменную без изменений, если нет ведущего 0.

eval $(date +"h=%H m=%M")
h=${h#0}
m=${m#0}
say "$h hours and $m minutes"

В bash, ksh или zsh вы можете использовать дополнительные шаблоны глобуса ksh для удаления любого числа ведущих 0s. В bash беги shopt -s extglobпервым. В zsh запускай setopt kshglobпервым.

eval $(date +"h=%H m=%M")
h=${h#+(0)}
m=${m#+(0)}
say "$h hours and $m minutes"
Жиль "ТАК - прекрати быть злым"
источник
1

В общем в bash:

test ${#number} -eq 2 && number=${number#0}

в результате чего

date +"%H %M" | 
{ read hours minutes
hours=${hours#0}
minutes=${minutes#0}
echo "${hours} hours and ${minutes} minutes"; }

Или разные:

date +"%H hours and %M minutes" | sed -n -e 's/0\([0-9]\)/\1/g' -e p

Я удивлен, что у даты нет соответствующих опций формата.

Хауке Лагинг
источник