ฉันจะลบเลขศูนย์นำออกจากผลลัพธ์ของ 'วันที่' หรือหลีกเลี่ยงการตีความเลขฐานแปดของเลขทศนิยมดังกล่าวได้อย่างไร


37

ฉันมีสิ่งนี้:

date +"%H hours and %M minutes"

ฉันใช้เทศกาลเพื่อบอกว่ามัน .. แต่มันบอกว่า: "ศูนย์เก้าชั่วโมง" .. ฉันอยากให้มันพูดว่า "เก้าชั่วโมง"!

แต่วันที่ให้ฉัน 09 เสมอ ... ดังนั้นฉันสงสัยว่า bash สามารถทำให้กลายเป็นเพียงแค่ 9 ได้หรือไม่?

ในสคริปต์ที่ซับซ้อนฉันพยายาม

printf %d 09

แต่มันล้มเหลว .. ไม่ใช่เลขฐานแปด :(

ความคิดใด ๆ


OP คำตอบที่คุณยอมรับนั้นยอดเยี่ยมสำหรับกรณีเฉพาะของคุณ แต่ไม่ตรงกับชื่อคำถาม
einpoklum - คืนสถานะโมนิก้า

@ilkkachu ชื่อเดิมคือกุญแจสำคัญในการค้นหาคำถามนี้ฉันกำลังมองหาการบังคับให้มีการตีความทศนิยมของตัวเลขฐานแปด
muru

@muru, ใช่ฉันคิดว่าถ้าฉันสามารถจดบันทึกเกี่ยวกับแปดที่นั่น แต่ไม่ได้เกิดขึ้นด้วยคำพูดที่ดี คุณสามารถเปลี่ยนแน่นอนอย่างน้อยคุณก็รู้ว่าสิ่งที่คุณค้นหา? คำตอบและคำถามส่วนใหญ่ดูเหมือนจะเกี่ยวกับการลบศูนย์นำ
ilkkachu

คำตอบ:


49
  • ในกรณีของคุณคุณสามารถปิดการใช้งานการเติมเต็มศูนย์ได้โดยผนวก-หลังจาก%ในสตริงรูปแบบของวันที่:%-H

    โดยค่าเริ่มต้นแผ่นวันที่เขตข้อมูลตัวเลขด้วยศูนย์ ธงที่เป็นตัวเลือกต่อไปนี้อาจเป็นไปตาม '%':

    • - (เครื่องหมายขีดคั่น) ห้ามใช้แผ่นฟิลด์
    • _ (ขีดล่าง) แผ่นที่มีช่องว่าง
    • 0 (ศูนย์) แผ่นที่มีศูนย์
    • ^ ใช้ตัวพิมพ์ใหญ่หากเป็นไปได้
    • # ใช้กรณีตรงข้ามถ้าเป็นไปได้

    ดูคู่มือวันที่

  • หากคุณต้องการตีความตัวเลขในฐานที่แตกต่างกันในทุบตี

    • ค่าคงที่ที่มี 0 นำหน้าจะถูกตีความเป็นตัวเลขฐานแปด
    • นำหน้า 0x หรือ 0X หมายถึงเลขฐานสิบหก
    • มิฉะนั้นตัวเลขจะอยู่ในรูปแบบ [base #] n โดยที่ base เป็นตัวเลขทศนิยมระหว่าง 2 ถึง 64 ที่แสดงถึงฐานเลขคณิตและ n คือตัวเลขในฐานนั้น

    ดังนั้นในการตีความตัวเลขเป็นทศนิยมให้ใช้10#nแบบฟอร์มเช่น10#09

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

    ดูส่วนการประเมินผลทางคณิตศาสตร์ของคู่มือทุบตี


2
ขอบคุณรายละเอียดมาก! btw 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))ไม่ได้
Luis A. Florit

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 เพิ่มเติมของ ksh เพื่อลบจำนวนชั้นนำ0ใด ๆ ใน 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

โดยทั่วไปในทุบตี:

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

ฉันประหลาดใจที่วันที่ไม่มีตัวเลือกรูปแบบที่เหมาะสม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.