Як я можу видалити провідні нулі з виводу 'date' або уникнути восьмеричної інтерпретації таких десяткових чисел?


37

У мене це:

date +"%H hours and %M minutes"

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

але побачення завжди дають мені 09 ... тож мені цікаво, чи може Баш легко зробити це лише 9?

у складному сценарії я намагався подобатися

printf %d 09

але не виходить .. не восьмеричний :(

будь-яка ідея?


ОП, ваша прийнята відповідь чудова - для вашого конкретного випадку, але вона не відповідає заголовку питання.
einpoklum - відновити Моніку

@ilkkachu старий заголовок був ключовим для мене, коли я шукав це питання, шукаючи примусової інтерпретації чисел у форматі восьмери.
муру

@muru, так, я подумав, чи зможу я занести записку про восьмикутник, але не придумав приємного фразування. Ви могли, звичайно, змінити це, принаймні ви знаєте, що шукали? Відповіді та запитання, як і раніше, в основному стосуються зняття провідного нуля.
ilkkachu

Відповіді:


49
  • У вашому випадку ви можете просто відключити нульове прокладку, додавши -після цього %в рядок формату дати:%-H

    За замовчуванням датує числові поля з нулями. Наступні необов'язкові прапори можуть слідувати за "%":

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

    Дивіться посібник з дати

  • Якщо ви хочете інтерпретувати число в різній базі, в bash

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

    Отже, щоб інтерпретувати число як десятковий, використовуйте 10#nформу, наприклад.10#09

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

    Дивіться розділ " Арифметична оцінка " посібника з башма.


2
THX, дуже докладно! btw, echo $((011)) $((10#011))є ще одним хорошим прикладом, який дає результат9 11
Водолій Сила

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 ви можете використовувати додаткові шаблони glob для видалення будь-якої кількості ведучих 0s. У баш, біжи 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

Загалом у басі:

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

Я здивований, що дата не має відповідних параметрів формату.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.