Làm cách nào để xóa các số 0 đứng đầu khỏi đầu ra của 'ngày' hoặc tránh việc giải thích bát phân cho các số thập phân như vậy?


37

Tôi có cái này:

date +"%H hours and %M minutes"

Tôi sử dụng lễ hội để nói lên .. nhưng nó nói như: "không chín giờ" .. tôi muốn nó nói "chín giờ"!

nhưng ngày luôn cho tôi 09 ... vì vậy tôi tự hỏi liệu bash có thể dễ dàng biến nó thành 9 không?

trong kịch bản phức tạp tôi đã thử như

printf %d 09

nhưng nó thất bại .. không phải bát phân :(

bất kỳ ý tưởng?


OP, câu trả lời được chấp nhận của bạn là tuyệt vời - đối với trường hợp cụ thể của bạn, nhưng nó không phù hợp với tiêu đề câu hỏi.
einpoklum - phục hồi Monica

@ilkkachu tiêu đề cũ là chìa khóa trong tôi khi tìm câu hỏi này, tìm cách buộc giải thích thập phân các số định dạng bát phân.
muru

@muru, yeah, tôi nghĩ rằng nếu tôi có thể ghi chú về bát phân ở đó, nhưng đã không đưa ra một cụm từ hay. Bạn có thể thay đổi nó tất nhiên, ít nhất bạn biết những gì bạn đã tìm kiếm? Các câu trả lời và câu hỏi dường như vẫn chủ yếu là về việc loại bỏ số 0 đứng đầu.
ilkkachu

Câu trả lời:


49
  • Trong trường hợp của bạn, bạn chỉ cần vô hiệu hóa phần đệm bằng cách nối thêm -sau %trong chuỗi định dạng ngày:%-H

    Theo mặc định, ngày đệm các trường số với số không. Các cờ tùy chọn sau có thể theo '%':

    • - (gạch nối) không đệm trường
    • _ (gạch dưới) pad với khoảng trắng
    • 0 (không) pad với số không
    • ^ sử dụng chữ hoa nếu có thể
    • # sử dụng ngược lại nếu có thể

    Xem hướng dẫn sử dụng ngày

  • Nếu bạn muốn giải thích số trong cơ sở khác nhau, trong bash

    • Các hằng số có 0 đứng đầu được hiểu là các số bát phân.
    • Số 0x hoặc 0X hàng đầu biểu thị thập lục phân.
    • Mặt khác, các số có dạng [cơ sở #] n, trong đó cơ sở là số thập phân từ 2 đến 64 đại diện cho cơ sở số học và n là một số trong cơ sở đó

    Vì vậy, để diễn giải một số là số thập phân, hãy sử dụng 10#nbiểu mẫu, vd.10#09

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

    Xem phần Đánh giá số học của hướng dẫn sử dụng bash.


2
thx, rất chi tiết! btw, echo $((011)) $((10#011))là một ví dụ điển hình khác cho kết quả đầu ra9 11
Sức mạnh Bảo Bình

1
Điều này không hoạt động đối với số âm: lat=048 ; latd=${lat#0} ; echo $((latd-1))hoạt động, nhưng lat=-048 ; latd=${lat#0} ; echo $((latd-1))không.
Luis A. Florit

plus=$((10#01))
Bác sĩ Beco

2

Nếu bạn đang cố gắng so sánh theo số thập phân với giá trị ngày, tôi đã thấy phương pháp này rất hiệu quả:

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

Điều đó luôn mang lại một giá trị thập phân. Vì vậy, tôi có thể làm điều này:

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

Không có vấn đề với 08 hoặc 09 theo cách này. Sử dụng% 10 thay vì% 100 mang lại cho bạn phạm vi mười phút từ 0 đến 9. Tôi cũng thấy các giá trị sau mang lại giá trị thập phân, không có số 0 đứng đầu:

echo "$((10#$(date +%M)))"

2

Có thể dễ dàng loại bỏ một đầu dẫn 0từ một biến. Điều này để lại biến không thay đổi nếu không có hàng đầu 0.

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

Trong bash, ksh hoặc zsh, bạn có thể sử dụng các mẫu hình cầu bổ sung của ksh để xóa bất kỳ số lượng 0s hàng đầu nào . Trong bash, chạy shopt -s extglobtrước. Trong zsh, chạy setopt kshglobtrước.

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

1

Nói chung trong bash:

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

dẫn đến

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

Hoặc, khác nhau:

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

Tôi ngạc nhiên rằng ngày đó không có tùy chọn định dạng phù hợp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.