ฉันจะหยุด Bash ไม่ให้ตีความรหัสฐานแปดแทนจำนวนเต็มได้อย่างไร


13

ฉันกำลังเขียนสคริปต์ Horoscope RSS เป็นบทนำสู่โปรเจ็กต์ Unix / Linux และพบปัญหาศาสตราจารย์ของฉันไม่สามารถแก้ไขได้ในเวลาที่ฉันสามารถอยู่หลังเลิกเรียนได้ เนื่องจากฉันไม่สามารถหาวิธีใช้วันที่ที่แท้จริงเป็นสิ่งที่ต้องตรวจสอบฉันคิดว่าฉันลองเลขคณิตพื้นฐานโดยให้ผู้ใช้ป้อนเป็นหมายเลขมาตรฐานในรูปแบบ MMDD ตามที่เขาพูดสคริปต์ดูเหมือนว่าจะอ่านอินพุตเป็นรหัสฐานแปดแทนจำนวนเต็ม นี่คือตัวอย่างของสคริปต์:

    elif [ "$olddate" -gt 1121 ] && [ "$olddate" -lt 1131 ] || [ "$olddate" -gt 1200 ] && [ "$olddate" -lt 1222 ]
then
echo "You are Sagittarius"
exit
elif [ "$olddate" -gt 1221 ] && [ "$olddate" -lt 1232 ] || [ "$olddate" -gt 0100 ] && [ "$olddate" -lt 0120 ]
then
echo "You are Capricorn"
exit

นี่คือกระดูกเปลือยฉันเอาส่วน RSS ออกไป "olddate" เป็นอินพุตที่คาดไว้จากพรอมต์การอ่านของฉัน ในขณะที่ทำงาน 1121 ถึง 1131, 1200 ถึง 1222 และ 0100 ถึง 0120 ก็ไม่มีอะไรเกิดขึ้นระหว่าง 1221 ถึง 1232 เขาคิดว่าเป็นปัญหาตั้งแต่วาง 113 โดยไม่ต้องนำ 0 ทำงานให้กับราศีมังกร ฉันเพิ่งเจอปัญหาที่ 0323 ซึ่งควรจะให้ฉันราศีเมษ (-gt 0320 && -lt 0332) ให้ฉันราศีกุมภ์ (วันที่มี -gt 0119 && -lt 0132 || -gt 0200 && -lt 0219) เช่นเดียวกับ 0417 ไม่ทำงาน (ซึ่งเป็นช่วงวันที่อื่น ๆ สำหรับราศีเมษ, -gt 0400 && -lt 0420)

ฉันต้องทำอย่างไรเพื่อให้ BASH ตีความอินพุตเป็นตัวเลขจริง เขาพยายามเปลี่ยนคำสั่งอ่านเพื่อคาดหวังว่า "userdate" เป็นอินพุตแล้วจึงเพิ่ม

olddate=`printf '%d\n' "$userdate"`

แต่นั่นไม่ได้ผล ขอบคุณล่วงหน้าสำหรับทุกคนที่สามารถช่วยฉันได้


ไม่สามารถทำซ้ำใน bash 4.4.12
Ignacio Vazquez-Abrams

1
$ olddate เป็นสตริงไม่ใช่ตัวเลขดังนั้นให้ใช้การเปรียบเทียบสตริงและหลีกเลี่ยงความยุ่งเหยิงทั้งหมด
สตีเฟ่นแฮร์ริส

2
@StephenHarris: ดังนั้นค่าทางด้านขวาของผู้ประกอบการ นั่นเป็นสาเหตุที่testมีตัวดำเนินการตัวเลขที่ชัดเจน
Ignacio Vazquez-Abrams

สิ่งหนึ่งที่ควรทราบ แต่ไม่เกี่ยวข้องกับคำถามหลักคือสัญญาณราศีของคุณนั้นขึ้นอยู่กับปีที่คุณเกิดด้วยเช่นกันถ้าวันเดือนเกิดของคุณใกล้เคียงกับการเปลี่ยนแปลงระหว่างสองสัญญาณราศี สัญลักษณ์จักรราศีของคุณขึ้นอยู่กับส่วนที่ 1/12 ของท้องฟ้าที่ดวงอาทิตย์อยู่ในเวลาที่คุณเกิด แต่เนื่องจากจำนวนวันในหนึ่งปีไม่ได้เป็นจำนวนเต็มหรือหารด้วย 12 จึงมีการเปลี่ยนแปลงบางอย่างจาก ปีต่อปี รูปแบบนี้ซับซ้อนเกินกว่าที่จะจับได้ในต้นไม้ที่ถ้าอื่น แต่มันเป็นเพียงสิ่งที่น่าจะรู้
Nzall

คำตอบ:


28

คุณสามารถบังคับให้แปลงตัวเลขเป็นฐานเฉพาะใน bash ดังนี้:

$ foo=400
$ echo $((8#$foo))
256
$ bar=0100
$ echo $((10#$bar))
100

$((base#value))โดยทั่วไปรูปแบบคือ

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