ฉันกำลังพยายามทำบางสิ่งที่ธรรมดาพอ: แยกวิเคราะห์อินพุตของผู้ใช้ในเชลล์สคริปต์ หากผู้ใช้ระบุจำนวนเต็มที่ถูกต้องสคริปต์จะทำสิ่งหนึ่งและถ้าไม่ถูกต้องสคริปต์จะทำอย่างอื่น ปัญหาคือฉันไม่พบวิธีที่ง่าย (และสง่างามพอสมควร) ในการทำสิ่งนี้ - ฉันไม่ต้องการแยกมันออกจากถ่านโดยใช้ถ่าน
ฉันรู้ว่ามันต้องง่าย แต่ฉันไม่รู้วิธี ฉันสามารถทำได้ในหลายสิบภาษา แต่ไม่ใช่ BASH!
ในการวิจัยของฉันฉันพบสิ่งนี้:
นิพจน์ทั่วไปเพื่อทดสอบว่าสตริงประกอบด้วยจำนวนจริงที่ถูกต้องในฐาน 10 หรือไม่
และมีคำตอบในนั้นที่พูดถึง regex แต่เท่าที่ฉันรู้นั่นคือฟังก์ชันที่มีอยู่ใน C (อื่น ๆ ) ยังคงมีสิ่งที่ดูเหมือนคำตอบที่ดีดังนั้นฉันจึงลองใช้ grep แต่ grep ไม่รู้ว่าจะทำอย่างไรกับมัน ฉันพยายาม -P ซึ่งในกล่องของฉันหมายถึงถือว่าเป็น PERL regexp - nada Dash E (-E) ไม่ทำงานเช่นกัน และไม่ได้ -F
เพื่อความชัดเจนฉันกำลังลองสิ่งนี้โดยมองหาผลลัพธ์ใด ๆ - จากตรงนั้นฉันจะแฮ็กสคริปต์เพื่อใช้ประโยชน์จากสิ่งที่ฉันได้รับ (IOW ฉันคาดหวังว่าอินพุตที่ไม่สอดคล้องจะไม่ส่งคืนอะไรเลยในขณะที่บรรทัดที่ถูกต้องซ้ำ ๆ กัน)
snafu=$(echo "$2" | grep -E "/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/")
if [ -z "$snafu" ] ;
then
echo "Not an integer - nothing back from the grep"
else
echo "Integer."
fi
ใครช่วยอธิบายวิธีการนี้ได้ง่ายที่สุด?
ตรงไปตรงมานี่คือการทดสอบสั้น ๆ ในความคิดของฉัน มันควรมีธงแบบนี้
if [ -I "string" ] ;
then
echo "String is a valid integer."
else
echo "String is not a valid integer."
fi
[
เก่าเข้ากันได้test
;[[
เป็นสิ่งใหม่ของ Bash ที่มีการดำเนินการมากขึ้นและกฎการอ้างอิงที่แตกต่างกัน หากคุณตัดสินใจที่จะใช้ Bash ไปแล้วให้ไป[[
(มันดีกว่ามาก) หากคุณต้องการพกพาไปยังกระสุนอื่น ๆ ให้หลีกเลี่ยงโดย[[
สิ้นเชิง