อ่านคำสั่งด้วย ??? อินพุต


1

ทำไมเมื่ออ่านอินพุตด้วยreadและ???ผลลัพธ์คืออินพุตคือbin srcอะไร

$ read
???
$ echo $REPLY
bin src

ทำงานbashบน macOS

คำตอบ:


3

ข้อมูลที่จัดขึ้นในตัวแปรREPLYยังคง???แต่ผลจากการใช้ตัวแปรunquotedด้วยechoเช่นคุณกำลังทำเป็นเช่นเดียวกับการทำ

echo ???

คุณต้องเพิ่มเครื่องหมายคำพูดเพื่อขยายตัวแปรทั้งหมด

เมื่อคุณปล่อยส่วนขยายตัวแปรไว้โดยไม่ระบุสองสิ่งเกิดขึ้น:

  1. ค่าของตัวแปรถูกแบ่งออกเป็นหลายคำ การแยกเกิดขึ้นทุกที่ที่ตัวละครเหมือนกันกับหนึ่งในตัวละครใน$IFS(ช่องว่างแท็บและขึ้นบรรทัดใหม่ตามค่าเริ่มต้น) ในกรณีของคุณผลลัพธ์ของการแยกจะเหมือนกับก่อนการแยก (คำเดียว???) หากค่าของ$IFSไม่ถูกแก้ไข
  2. คำที่สร้างขึ้นแต่ละคำผ่านการสร้างชื่อไฟล์หรือ "ชื่อไฟล์กลม" นั่นหมายความว่าหากคำใดคำหนึ่งเป็นรูปแบบกลม ๆ ซึ่ง???ก็คือชื่อไฟล์ใด ๆ ที่ตรงกับรูปแบบนั้นจะเข้ามาแทนที่รูปแบบนั้น รูปแบบนั้น???ตรงกับชื่อไฟล์ยาวสามตัวอักษรและคุณมีสองอย่างในไดเรกทอรีการทำงานปัจจุบันของคุณ

ไม่มีสิ่งเหล่านี้เกิดขึ้นหากการขยายตัวของตัวแปรเป็นการอ้างอิงแบบสองครั้ง

ตัวอย่างสร้างปัญหาของคุณขึ้นใหม่และแก้ไข:

$ ls
X11R6   games   lib     libexec mdec    ports   share   xobj
bin     include libdata local   obj     sbin    src
$ read
???
$ echo $REPLY
bin lib obj src
$ echo ???
bin lib obj src
$ echo "$REPLY"
???

อีกตัวอย่างหนึ่งในไดเรกทอรีเดียวกันกับข้างบนแสดงให้เห็นว่าสตริงที่ฉันป้อนถูกแบ่งออกเป็นสองคำ ( ???และs*) และสิ่งเหล่านั้นจะถูกนำมาใช้เป็นรูปแบบชื่อไฟล์ที่ลูป:

$ read
??? s*
$ echo $REPLY
bin lib obj src sbin share src
$ echo "$REPLY"
??? s*

ขอให้สังเกตว่าsrcได้รับออกมาเป็นสองเท่ามันตรงกับทั้งสองและ???s*

ที่เกี่ยวข้อง:

สรุปสั้น ๆ ของคำถามข้างต้นและคำตอบ: เสมอราคาคู่ทั้งหมดขยายถ้าคุณรู้ว่าคนที่ไม่จำเป็นต้องใช้หรือถ้าคุณต้องการจริงจะก่อให้เกิดการแยกและ globbing

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