การเปรียบเทียบ Bash และตัวดำเนินการนิพจน์


11

ฉันใหม่ในการเขียนโปรแกรมทุบตี ฉันอ่านคำแนะนำที่ดียาว ๆ สองคำ แต่พวกเขาทำให้ฉันสับสนเกี่ยวกับโอเปอเรเตอร์และคำหลัก

ข้อไหนที่ใช้กันอย่างแพร่หลายและแพร่หลาย? ฉันไม่รู้ว่าจะใช้เมื่อใดและเพราะเหตุใด

  1. test, [[ ]]หรือ[ ]หรือแม้กระทั่ง(( ))
  2. $((exp)) หรือ $[exp]
  3. -gtหรือ>, geหรือ>=อื่น ๆ
  4. เวลาที่จะใช้<และ>หรือ( )เมื่อเราต้องหลบหนีด้วย\: \< \(ฯลฯ
  5. ==หรือ=(เปรียบเทียบสตริง)

ฉันรู้ว่าความแตกต่างพื้นฐานระหว่าง[และ[[คำถามอื่น ๆ นั้นเป็นปริศนาสำหรับฉัน

ขอบคุณล่วงหน้า


2
วิกิพีเดียมีประโยชน์มากที่ขึ้นอยู่กับวันและกล่าวถึงการปฏิบัติที่ดีมากคือวิกิพีเดียของเกร็ก คู่มือ Bash และคำถามที่พบบ่อยมีประโยชน์อย่างยิ่ง

คำตอบ:


5
  • testเป็นเชลล์ในตัวที่ทดสอบ (แน่นอน) สำหรับเงื่อนไขบางอย่าง เชลล์ที่เก่ากว่าบางตัวต้องการคำสั่งพิเศษ /usr/bin/testดังนั้นคุณจะพบยังโปรแกรมที่
  • [เป็นโปรแกรมสำหรับทดสอบเงื่อนไขบางอย่าง /usr/bin/[ซอฟแวร์นี้ต้องยังวงเล็บปิดและคุณสามารถค้นหาได้ที่
  • [[…]]เป็นทางเลือกและtest [ได้รับการพัฒนาสำหรับ Korn shell ( ksh) แต่คุณจะพบมันใน Bash เวอร์ชั่นที่มากกว่า 2 และใน Z Shell วงเล็บคู่มีคุณสมบัติที่ดีบางอย่าง:
    • เชลล์ไม่แยกคำหรือขยายชื่อไฟล์
    • คุณไม่จำเป็นต้องอ้างถึง
    • แทนที่จะ-a(และ) หรือ-o(OR) คุณสามารถใช้หรือ&&||
    • =สามารถทำมากขึ้น
  • ((…))letเทียบเท่ากับ ดังนั้นโดยทั่วไปเป็นเช่นเดียวกับ((expression)) let "expression"อย่างไรก็ตามด้วยletคุณสามารถใช้มากกว่าหนึ่งนิพจน์ แต่วงเล็บปีกกาคู่อนุญาตเพียงหนึ่งแสดงออก
  • $((…))(และยัง$[…]) ทำการคำนวณบางอย่าง คุณเชลล์พยายามคำนวณนิพจน์ภายในวงเล็บปีกกาและแทนที่นิพจน์ด้วยผลลัพธ์ ดังนั้นจะนำไปสู่echo $((1+1)) echo 2ดังนั้นกระสุนของคุณพิมพ์หมายเลข 2

ทุกครั้งเมื่อคุณต้องการที่จะเปรียบเทียบตัวเลขสองคุณควรจะใช้ตัวเลือกที่มีเส้นประและตัวอักษรสองตัว ( -ge, -ltฯลฯ ) หากคุณต้องการเปรียบเทียบสตริงคุณควรใช้หรือ=!=

คำถามของคุณเกี่ยวกับการหลบหนีค่อนข้างตอบยาก เพราะมันขึ้นอยู่กับซอฟต์แวร์ที่คุณใช้นอกเหนือจากเปลือก ดังนั้นคือgrepและgrep -Eต้องการการหลบหนีที่แตกต่างกัน และนี่ก็เป็นกรณีที่มีsed, awkและอื่น ๆ ดังนั้นตัวเลือกที่ดีที่สุดคือดู manpage หลังจากผ่านไประยะหนึ่งคุณจะคุ้นเคยและรู้ว่าควรใช้การหลบหนีเมื่อใด


ขอขอบคุณ. อีกหนึ่งคำถาม - เพราะมีความเป็นไปได้ที่จะทำการเปรียบเทียบโดยใช้ ((... )) - มันเป็นเรื่องธรรมดามากกว่าที่จะใช้รุ่นนี้: if ((2> 1)) หรือนี่: ถ้า [[2-gt 1]]
MikeD

ฉันคิดว่าif [ 2 -gt 1 ]; …มันเป็นเรื่องธรรมดามากขึ้นเพราะฉันเห็นสิ่งนี้บ่อยในเชลล์สคริปต์และเท่าที่ฉันรู้ว่านี่เป็นไปตาม POSIX
qbi

สิ่งที่ควรทราบอีกอย่างคือ [expression] เป็นจริงถ้า expression ประเมินเป็น / return zero แต่ (((expression)) เป็นจริงถ้า expression ประเมินเป็น / ส่งกลับไม่ใช่ศูนย์
Joe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.