ทำไมเมื่ออ่านอินพุตด้วยreadและ???ผลลัพธ์คืออินพุตคือbin srcอะไร
$ read
???
$ echo $REPLY
bin src
ทำงานbashบน macOS
ทำไมเมื่ออ่านอินพุตด้วยreadและ???ผลลัพธ์คืออินพุตคือbin srcอะไร
$ read
???
$ echo $REPLY
bin src
ทำงานbashบน macOS
คำตอบ:
ข้อมูลที่จัดขึ้นในตัวแปรREPLYยังคง???แต่ผลจากการใช้ตัวแปรunquotedด้วยechoเช่นคุณกำลังทำเป็นเช่นเดียวกับการทำ
echo ???
คุณต้องเพิ่มเครื่องหมายคำพูดเพื่อขยายตัวแปรทั้งหมด
เมื่อคุณปล่อยส่วนขยายตัวแปรไว้โดยไม่ระบุสองสิ่งเกิดขึ้น:
$IFS(ช่องว่างแท็บและขึ้นบรรทัดใหม่ตามค่าเริ่มต้น) ในกรณีของคุณผลลัพธ์ของการแยกจะเหมือนกับก่อนการแยก (คำเดียว???) หากค่าของ$IFSไม่ถูกแก้ไข???ก็คือชื่อไฟล์ใด ๆ ที่ตรงกับรูปแบบนั้นจะเข้ามาแทนที่รูปแบบนั้น รูปแบบนั้น???ตรงกับชื่อไฟล์ยาวสามตัวอักษรและคุณมีสองอย่างในไดเรกทอรีการทำงานปัจจุบันของคุณไม่มีสิ่งเหล่านี้เกิดขึ้นหากการขยายตัวของตัวแปรเป็นการอ้างอิงแบบสองครั้ง
ตัวอย่างสร้างปัญหาของคุณขึ้นใหม่และแก้ไข:
$ 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