Bagaimana cara menghapus angka nol terkemuka dari output 'date' atau menghindari interpretasi oktal dari angka desimal seperti itu?

37

Aku punya ini:

date +"%H hours and %M minutes"

Saya menggunakan festival untuk mengatakannya .. tetapi dikatakan seperti: "nol sembilan jam" .. Saya ingin mengatakan "sembilan jam"!

tapi kencan selalu memberi saya 09 ... jadi saya ingin tahu apakah bash dapat dengan mudah menjadikannya hanya 9?

dalam naskah yang kompleks saya mencoba seperti

printf %d 09

tapi gagal .. bukan oktal :(

ada ide?

Kekuatan Aquarius
sumber
OP, jawaban yang Anda terima bagus - untuk kasus spesifik Anda, tetapi tidak cocok dengan judul pertanyaan.
einpoklum - mengembalikan Monica
@ilkkachu judul lama adalah kunci dalam menemukan pertanyaan ini, mencari pemaksaan desimal dari angka format oktal.
muru
@uru, ya, saya pikir jika saya bisa menempel catatan tentang oktal di sana, tetapi tidak muncul dengan kalimat yang bagus. Anda dapat mengubahnya tentu saja, setidaknya Anda tahu apa yang Anda cari? Jawaban dan pertanyaan terutama tampaknya tentang menghapus nol di depan.
ilkkachu

Jawaban:

49
  • Dalam kasus Anda, Anda dapat dengan mudah menonaktifkan zero padding dengan menambahkan -setelah %dalam format string tanggal:%-H

    Secara default, date pad bidang angka dengan angka nol. Bendera opsional berikut dapat mengikuti '%':

    • - (tanda hubung) jangan letakkan bidangnya
    • _ (garis bawah) pad dengan spasi
    • 0 (nol) pad dengan nol
    • ^ gunakan huruf besar jika memungkinkan
    • # gunakan kasus yang berlawanan jika memungkinkan

    Lihat manual tanggal

  • Jika Anda ingin menafsirkan angka di pangkalan yang berbeda, dalam bash

    • Konstanta dengan awalan 0 ditafsirkan sebagai angka oktal.
    • Sebuah 0x atau 0X terkemuka menunjukkan heksadesimal.
    • Kalau tidak, bilangan mengambil bentuk [basis #] n, di mana basis adalah angka desimal antara 2 dan 64 yang mewakili basis aritmatika, dan n adalah angka dalam basis itu

    Jadi, untuk menafsirkan angka sebagai desimal, gunakan 10#nformulir, misalnya.10#09

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

    Lihat bagian Evaluasi Aritmatika dari manual bash.

LiuYan 刘 研
sumber
2
Terima kasih, sangat detail! btw, echo $((011)) $((10#011))adalah contoh bagus lain yang keluar9 11
Aquarius Power
1
Ini tidak berfungsi untuk angka negatif: lat=048 ; latd=${lat#0} ; echo $((latd-1))berfungsi, tetapi lat=-048 ; latd=${lat#0} ; echo $((latd-1))tidak.
Luis A. Florit
plus=$((10#01))
Dr Beco
2

Jika Anda mencoba melakukan perbandingan dalam desimal dengan nilai tanggal, saya menemukan metode ini sangat efektif:

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

Itu selalu menghasilkan nilai desimal. Jadi saya bisa melakukan ini:

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

Tidak ada masalah dengan 08 atau 09 dengan cara ini. Menggunakan% 10 bukannya% 100 memberi Anda rentang sepuluh menit dari 0 hingga 9. Saya juga menemukan yang berikut ini memberikan nilai desimal, tanpa memimpin nol:

echo "$((10#$(date +%M)))"
Dickster
sumber
2

Portable, Anda dapat dengan mudah menghapus sebuah pemimpin 0dari variabel. Ini membuat variabel tidak berubah jika tidak ada yang memimpin 0.

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

Di bash, ksh atau zsh, Anda dapat menggunakan pola glob tambahan ksh untuk menghapus sejumlah pemimpin 0. Di bash, jalankan shopt -s extglobdulu. Di zsh, jalankan setopt kshglobdulu.

eval $(date +"h=%H m=%M")
h=${h#+(0)}
m=${m#+(0)}
say "$h hours and $m minutes"
Gilles 'SANGAT berhenti menjadi jahat'
sumber
1

Secara umum dalam bash:

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

yang menghasilkan

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

Atau berbeda:

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

Saya terkejut bahwa tanggal tidak memiliki opsi format yang sesuai.

Hauke ​​Laging
sumber