ทำไมเมื่ออ่านอินพุตด้วย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