ก่อนอื่นให้สังเกตว่าเครื่องหมายทับเดียวตรงมากเกินไป
$ echo $'eegg \n e.g.' | grep e\.g\.
eegg
e.g.
เท่าที่เกี่ยวข้องกับทุบตีเป็นระยะเวลาหนีเหมือนช่วงเวลา ทุบตีผ่านระยะเวลาที่จะgrep สำหรับ grep จุดจะจับคู่กับอะไรก็ได้
ตอนนี้ให้พิจารณา:
$ echo $'eegg \n e.g.' | grep e\\.g\\.
e.g.
$ echo $'eegg \n e.g.' | grep e\\\.g\\\.
e.g.
$ echo $'eegg \n e.g.' | grep e\\\\.g\\\\.
$
เมื่อ Bash เห็นเครื่องหมายทับสองครั้งจะลดลงเป็นเครื่องหมายทับเดียวและส่งผ่านไปยัง grep ซึ่งในการทดสอบครั้งแรกของทั้งสามครั้งข้างต้นเราจะเห็นเครื่องหมายทับเดียวก่อนช่วงเวลาหนึ่ง ดังนั้นนี่คือสิ่งที่ถูกต้อง
ด้วยสามสแลช Bash จะลดสองครั้งแรกเป็นสแลชเดียว \.
จากนั้นก็เห็น เนื่องจากช่วงเวลาที่หลบหนีไม่มีความหมายพิเศษต่อ Bash นี่จึงลดลงเป็นช่วงเวลาธรรมดา ผลลัพธ์คือ grep เห็นตามที่เราต้องการคือเครื่องหมายทับก่อนจุด
ด้วยสี่สแลช Bash ลดแต่ละคู่ให้เป็นสแลชเดี่ยว Bash ส่งต่อไปยัง grep สอง slash และ a period grep เห็นทั้งสองทับและระยะเวลาและลดสองทับที่เดียวที่แท้จริงเฉือน ถ้าอินพุตมีเครื่องหมายสแลชตามตัวอักษรตามด้วยอักขระใด ๆ ไม่มีการจับคู่
เพื่อแสดงให้เห็นว่าสุดท้ายโปรดจำไว้ว่าภายในเครื่องหมายคำพูดเดี่ยวอักขระทั้งหมดเป็นตัวอักษร ดังนั้นเมื่อกำหนดบรรทัดอินพุตสามบรรทัดต่อไปนี้คำสั่ง grep จะจับคู่เฉพาะบนบรรทัดที่มีตัวอักษรสแลชในอินพุต:
$ echo 'eegg
e.g.
e\.g\.' | grep e\\\\.g\\\\.
e\.g\.
สรุปพฤติกรรมของ Bash
สำหรับ Bash กฎนั้นคือ
ดังนั้น:
$ echo \. \\. \\\. \\\\.
. \. \. \\.
มีวิธีง่าย ๆ ในการหลีกเลี่ยงความสับสนทั้งหมดนี้: บนบรรทัดคำสั่ง Bash ควรมีการวางนิพจน์ทั่วไปไว้ในเครื่องหมายคำพูดเดี่ยว ภายในเครื่องหมายคำพูดเดี่ยว Bash จะทิ้งทุกสิ่งไว้คนเดียว
$ echo '\. \\. \\\. \\\\.' # Note single-quotes
\. \\. \\\. \\\\.
\\\.
และให้ grep\.
แต่ไม่ คำถามที่ดี