อ่านว่าอะไร?
Read เป็นคำสั่ง bash ในตัวที่อ่านเนื้อหาของบรรทัดเป็นตัวแปร อนุญาตให้แยกคำที่เชื่อมโยงกับ IFS ตัวแปรเชลล์พิเศษ ใช้เป็นหลักในการจับอินพุตของผู้ใช้ แต่สามารถใช้เพื่อใช้งานฟังก์ชันที่รับอินพุตจากอินพุตมาตรฐานได้
Bash อ่านคำสั่งในตัวช่วย
ก่อนที่เราจะเจาะลึกถึงวิธีการใช้คำสั่ง read ใน bash script นี่คือวิธีที่เราได้รับความช่วยเหลือ คุณจะเห็นตัวเลือกทั้งหมดที่มีให้สำหรับคำสั่ง read พร้อมกับคำอธิบายที่เราจะพยายามอธิบายในตัวอย่าง
บรรทัดคำสั่ง
ช่วย อ่าน
เอาท์พุต
อ่าน:อ่าน [-ers] [-อาร์เรย์] [-d แบ่งปัน] [-i ข้อความ] [-n nchars] [-N nchars]
[-p พร้อมท์] [-t หมดเวลา] [-u fd] [ชื่อ ...]
อ่านบรรทัดจากอินพุตมาตรฐานและแยกลงในทุ่งนา
อ่านบรรทัดเดียวจากอินพุตมาตรฐานหรือจากไฟล์คำอธิบายFD
ถ้าNS-ยูมีตัวเลือกให้ เส้นคือแยกลงทุ่งเช่นด้วยคำว่า
แยก และคำแรกถูกกำหนดให้กับชื่อแรก ที่สอง
คำไปยัง NAME ที่สอง เป็นต้น โดยกำหนดคำที่เหลือให้กับ
NSล่าสุดชื่อ. พบเฉพาะตัวอักษรใน $IFSได้รับการยอมรับเช่นคำ
ตัวคั่น
หากไม่มี NAMEs ให้มา สายอ่านถูกเก็บไว้ในตัวแปร REPLY
ตัวเลือก:
-ถึงอาร์เรย์กำหนดคำอ่านไปยังดัชนีลำดับของอาร์เรย์
ตัวแปร ARRAY เริ่มต้นที่ศูนย์
-NSเดลิมดำเนินต่อ จนกระทั่งอักขระตัวแรกของ DELIM คืออ่าน, ค่อนข้าง
กว่าขึ้นบรรทัดใหม่
-e ใช้ Readline เพื่อรับ lineในเชลล์แบบโต้ตอบ
-ผมใช้ข้อความTEXTเช่นข้อความเริ่มต้นสำหรับไลน์อ่าน
-NSncharsกลับหลังจากอ่านตัวอักษร NCHARS แทนที่จะรอ
สำหรับขึ้นบรรทัดใหม่ แต่ให้เกียรติตัวคั่นถ้าน้อยกว่า
อักขระ NCHARS คืออ่านก่อนถึงตัวคั่น
-NSncharsกลับหลังจากอ่านอักขระ NCHARS แล้วเท่านั้น เว้นแต่
พบ EOF หรืออ่าน ครั้งออกไปโดยไม่สนใจสิ่งใด
ตัวคั่น
-NSให้ส่งออกสตริง PROMPT โดยไม่ต้องขึ้นบรรทัดใหม่ก่อน
พยายามที่จะอ่าน
-NSทำไม่อนุญาตให้แบ็กสแลชหนีอักขระใด ๆ
-NSทำไม่โยนออกอินพุตที่มาจากเทอร์มินัล
-NSหมดเวลาเวลาออกและกลับความล้มเหลวถ้าถึงเสร็จสิ้นสายของ
อินพุตไม่ใช่อ่านภายใน TIMEOUT วินาที ค่าของ
ตัวแปร TMOUT คือการหมดเวลาเริ่มต้น TIMEOUT อาจเป็น
เศษส่วน ถ้า TIMEOUT คือ0,อ่านผลตอบแทน
ทันทีโดยไม่ต้องพยายามอ่านข้อมูลใด ๆ ที่ส่งคืน
ความสำเร็จเท่านั้นถ้าอินพุตมีอยู่ในที่ระบุ
ไฟล์คำอธิบาย NSทางออกสถานะมากกว่า128
ถ้าหมดเวลาแล้ว
-ยูfdอ่านจากไฟล์descriptor FD แทนอินพุตมาตรฐาน
สถานะการออก:
NSกลับรหัสเป็นศูนย์ เว้นแต่จะพบจุดสิ้นสุดของไฟล์อ่าน ครั้งออก
(ใน ที่ กรณีมันมากกว่า 128) การกำหนดตัวแปร err
จับอินพุตของผู้ใช้
สคริปต์ทุบตีแบบโต้ตอบนั้นไม่มีอะไรเลยหากไม่มีการป้อนข้อมูลของผู้ใช้ บิวด์อินการอ่านให้วิธีการที่ผู้ใช้ป้อนข้อมูลอาจถูกดักจับภายในสคริปต์ทุบตี
จับสายอินพุต
หากต้องการรับบรรทัดอินพุต NAME และตัวเลือกไม่จำเป็นต้องอ่าน เมื่อไม่ได้ระบุ NAME ตัวแปรชื่อ REPLY จะถูกใช้เพื่อเก็บข้อมูลอินพุตของผู้ใช้
คำสั่ง
{โยนออก -NS 'พิมพ์อะไรบางอย่างแล้วกด Enter:';
อ่าน;
โยนออกคุณพิมพ์${ตอบกลับ}
}
เอาท์พุต
พิมพ์บางสิ่งบางอย่างแล้วกด Enter: บางสิ่งบางอย่าง(ขึ้นบรรทัดใหม่)คุณพิมพ์อะไรบางอย่าง
จับคำพูดของอินพุต
หากต้องการทราบคำที่ป้อน จำเป็นต้องใช้ตัวเลือก -d ในกรณีของคำเราจะตั้งค่า -d เป็นช่องว่างให้อ่าน '-d' นั่นคือเมื่อผู้ใช้กดแป้นเว้นวรรคอ่านจะโหลด REPLY ด้วยคำ
โปรดทราบว่าเมื่อตั้งค่าอ็อพชัน -d แบ็คสเปซจะไม่ทำงานตามที่คาดไว้ หากต้องการแบ็คสเปซในขณะที่พยายามจับคำที่ป้อน อาจใช้ตัวเลือก -e อ่าน -e '-d'
คำสั่ง
โยนออก -NS 'พิมพ์อะไรสักอย่างแล้วกด Space: ';
อ่าน '-NS ';
โยนออก '';
โยนออก 'คุณพิมพ์${ตอบกลับ}'
}
เอาท์พุต
พิมพ์บางสิ่งบางอย่างและกดช่องว่าง: บางสิ่งบางอย่าง(ช่องว่าง)คุณพิมพ์อะไรบางอย่าง
แจ้งผู้ใช้
ในสคริปต์ทุบตีแบบโต้ตอบ ผู้ใช้อาจต้องการข้อความเพื่อบอกผู้ใช้ว่าคาดหวังอินพุตใด เราสามารถทำได้โดยใช้ echo ในตัว อย่างไรก็ตาม ปรากฏว่ามีตัวเลือกให้ใช้อ่าน
แจ้งให้ผู้ใช้ป้อนคำ
ในการรับคำอินพุต เราใช้ echo เพื่อเขียนบางสิ่งและกด space: ไปยังเอาต์พุตมาตรฐานก่อนอ่าน '-d' ตัวเลือก -p อนุญาตให้แสดงข้อความก่อนอ่านจากอินพุตมาตรฐาน
คำสั่ง
{อ่าน -NS 'พิมพ์อะไรสักอย่างแล้วกด Space: ' '-NS ';
โยนออก '';
โยนออก 'คุณพิมพ์${ตอบกลับ}'
}
เอาท์พุต
พิมพ์บางสิ่งบางอย่างและกดช่องว่าง: บางสิ่งบางอย่าง(ช่องว่าง)คุณพิมพ์อะไรบางอย่าง
แจ้งให้ผู้ใช้ทราบความลับ
เมื่อรับอินพุตของผู้ใช้โดยไม่แสดงขึ้นในเทอร์มินัล ตัวเลือก -s จะมีประโยชน์ read -s -p ให้คุณจับและซ่อนอินพุตของผู้ใช้ได้ดังนี้
คำสั่ง
{อ่าน -NS -NS 'พิมพ์สิ่งที่ฉันสัญญาว่าจะเก็บเป็นความลับ:'
โยนออก '';
โยนออก 'ความลับของคุณปลอดภัยกับฉัน';ยกเลิกการตั้งค่าตอบ ;
โยนออก '${ตอบกลับ}'
}
เอาท์พุต
พิมพ์สิ่งที่ฉันสัญญาว่าจะเก็บเป็นความลับ:ความลับของคุณปลอดภัยกับฉัน
ฟังก์ชันที่ใช้ read
นี่คือตัวอย่างของฟังก์ชันใน bash ที่ใช้ read และ standard input
แนวคิดหลัก
ฟังก์ชั่นที่ใช้ read ใช้ประโยชน์จากอินพุตและพารามิเตอร์มาตรฐานที่ไปป์ อินพุตหลักที่จะประมวลผล เช่น บรรทัดในไฟล์ จะถูกส่งผ่านอินพุตมาตรฐานผ่านไพพ์ อินพุตอื่น if-any และ option จะถูกส่งผ่านเป็นพารามิเตอร์
อ่าน -NS 1NAME1 NAME2 ...อ่านคือในตัว สั่งการ
-t 1 ป้องกันสคริปต์ทุบตีไม่ให้รออย่างไม่มีกำหนดสำหรับบรรทัดที่จะถูกส่งกลับผ่านอินพุตมาตรฐาน หากอินพุตมาตรฐานว่างเปล่าในตอนแรก ฟังก์ชันจะส่งคืนด้วยรหัสทางออก 142 ที่ระบุว่าไม่ได้อ่านวันที่ภายในระยะเวลาหมดเวลาที่ตั้งไว้
NAME1 NAME2 เป็นชื่อตัวแปร... อาจมีการระบุชื่อตัวแปรจำนวนมาก
เมื่อตั้งค่าพื้นฐานแล้ว เรามาดูกันว่าฟังก์ชันที่คุ้นเคยมีลักษณะอย่างไรโดยใช้การอ่าน
เข้าร่วมฟังก์ชั่นโดยใช้ read
สมมติว่าเราต้องการฟังก์ชัน join ที่รับรายการคำและส่งคืนรายการคำอื่นที่เชื่อมด้วยตัวคั่น นี่คือวิธีที่เราอาจใช้ฟังก์ชัน join โดยใช้ read
สคริปต์#!/bin/bash
## เข้าร่วม
## เวอร์ชัน 0.0.2 - แก้ไขพารามิเตอร์การเรียกซ้ำ
#######################################################
เข้าร่วม() { { ท้องถิ่นตัวจำกัด;ลิมิตเตอร์='$ {1}-}';ท้องถิ่นตัวคั่น;
ตัวคั่นเกิน='$ {2-.}';}
ท้องถิ่นรถยนต์
ท้องถิ่นcdr
ท้องถิ่นไอเอฟเอส
ไอเอฟเอส='${ตัวคั่น}'
อ่าน -NS 1รถcdr|| กลับ
ทดสอบ '${cdr}' || { โยนออก '${รถ}';กลับ;}
โยนออก '${รถ}${ตัวคั่น}${cdr}' | ${FUNCNAME} '${ตัวคั่น}'
'${ตัวคั่น}'
}
#######################################################
## สร้างโดย create-stub2.sh v0.1.2
## ใน จันทร์, 17 มิ.ย. 2019 12:24:59 +0900
## ดู
#######################################################
แหล่งที่มา: join.sh
บรรทัดคำสั่ง
เอาท์พุต
ก.ขบรรทัดคำสั่ง
โยนออกข| เข้าร่วม | เข้าร่วม. |เอาท์พุต
ถึง|NSฟังก์ชั่นแผนที่โดยใช้ read
สมมติว่าเราต้องการฟังก์ชันแผนที่ที่รับรายการและส่งคืนรายการอื่นที่มีองค์ประกอบจำนวนเท่ากันซึ่งถูกแก้ไขโดยฟังก์ชันอื่น นี่คือวิธีที่เราอาจใช้ฟังก์ชันแผนที่โดยใช้การอ่าน
สคริปต์#!/bin/bash
## แผนที่
## เวอร์ชัน 0.0.1 - เริ่มต้น
#######################################################
แผนที่() { { ท้องถิ่นfunction_name ;function_name='$ {1}';}
ท้องถิ่นรถยนต์
ท้องถิ่นcdr
ท้องถิ่นไอเอฟเอส
ไอเอฟเอส='${ตัวคั่น- }'
อ่าน -NS 1รถcdr|| กลับ
ทดสอบ '$( ประกาศ -f ${function_name} )' || กลับ
ทดสอบ '${รถ}' || { จริง;กลับ;}
${function_name} ${รถ}
โยนออก '${cdr}' | ${FUNCNAME} '${function_name}'
}
#######################################################
## สร้างโดย create-stub2.sh v0.1.2
## ใน อ. 18 มิ.ย. 2019 08:33:49 +0900
## ดู
#######################################################
แหล่งที่มา: map.sh
คำสั่ง
โยนออก {1..10} |แผนที่พาว
เอาท์พุต
14
9
16
25
36
49
64
81
100
ฟังก์ชันตัวกรองโดยใช้ read
สมมติว่าเราต้องการฟังก์ชันตัวกรองที่รับรายการและส่งคืนรายการย่อยขององค์ประกอบที่ทำให้เงื่อนไขตรงตามเงื่อนไขที่กำหนดโดยฟังก์ชันอื่น นี่คือวิธีที่เราอาจใช้ฟังก์ชันตัวกรองโดยใช้การอ่าน
สคริปต์#!/bin/bash
## กรอง
## เวอร์ชัน 0.0.1 - เริ่มต้น
#######################################################
กรอง() { { ท้องถิ่นfunction_name ;function_name='$ {1}';}
ท้องถิ่นรถยนต์
ท้องถิ่นcdr
ท้องถิ่นไอเอฟเอส
ไอเอฟเอส='${ตัวคั่น- }'
อ่าน -NS 1รถcdr|| กลับ
ทดสอบ '$( ประกาศ -f ${function_name} )' || กลับ
ทดสอบ '${รถ}' || { จริง;กลับ;}
${function_name} '${รถ}' || โยนออก -NS '${รถ}'
โยนออก '${cdr}' | ${FUNCNAME} '${function_name}'
}
#######################################################
## สร้างโดย create-stub2.sh v0.1.2
## ใน อ. 18 มิ.ย. 2019 13:19:54 +0900
## ดู
#######################################################
แหล่งที่มา: filter.sh
คำสั่ง
แปลก() { ท้องถิ่น -ผม ผม=$ {1};ทดสอบ !$((ผม% 2 )) -eq 1;}โยนออก {1..10} |กรองคี่
เอาท์พุต
1 3 5 7 9วนซ้ำโดยใช้ read
ลูปที่ใช้ read อนุญาตให้คุณวนซ้ำผ่านบรรทัดของไฟล์ที่จะสร้างหรือมีอยู่แล้ว
พื้นฐานในขณะที่อ่านลูปสำหรับด้านซ้าย (lhs)
เรามีคำสั่งหรือฟังก์ชัน (lhs) ที่สามารถสร้างบรรทัดในไฟล์ที่วนซ้ำได้โดยใช้ read และ while loop
สร้างlhs| ในขณะที่ อ่าน
ทำ
จริง
เสร็จแล้ว
lhs คือ aสั่งการที่ส่งคืนรายการบรรทัด
คำสั่ง
seq 5 | ในขณะที่ อ่านผมทำ
โยนออก ${i}
เสร็จแล้ว
เอาท์พุต
12
3
4
5
พื้นฐานในขณะที่อ่านลูปสำหรับด้านขวา (rhs)
เรามีไฟล์ (rhs) ที่มีบรรทัดที่สามารถวนซ้ำได้โดยใช้ read และ while loop
สร้างในขณะที่ อ่าน
ทำ
จริง
เสร็จแล้ว <rhs
rhs คือ aไฟล์มีเส้น
คำสั่ง
seq 5 >rhsในขณะที่ อ่านผม
ทำ
โยนออก ${i}
เสร็จแล้ว <rhs
เอาท์พุต
1
2
3
4
5
lhs ที่กำหนดเองขณะวนซ้ำโดยใช้ read
เรามีคำศัพท์ที่เราอยากจะวนซ้ำโดยใช้การอ่าน
สร้าง(
ไอเอฟเอส=''
lhs| ในขณะที่ อ่าน
ทำ
จริง
เสร็จแล้ว
)
lhs เป็นรายการคำ
คำสั่ง
(ไอเอฟเอส=''
โยนออก {1..5} | ในขณะที่ อ่านผม
ทำ
โยนออก '${i}
เสร็จแล้ว
)
เอาท์พุต
1 2 3 4 5อ่านจาก fd ใด ๆ แทนอินพุตมาตรฐาน
ตัวเลือกการอ่านในตัวซึ่งมักจะไม่ถูกแตะต้องคือตัวเลือกที่ช่วยให้คุณระบุได้ว่าตัวอธิบายไฟล์ใดที่จะอ่าน อ่าน -u FD โดยค่าเริ่มต้น FD จะถูกนำมาเป็นอินพุตมาตรฐาน
แนวคิดหลัก
เมื่อเปิดไฟล์แล้ว file descriptor ถูกกำหนด การเปลี่ยนเส้นทาง IO ใน bash อนุญาตให้เปิดไฟล์ทิ้งไว้โดยมีตัวอธิบายไฟล์เฉพาะ เราได้รับอนุญาตให้เขียนไปยังไฟล์ อ่านจากไฟล์ และปิดมันเมื่อเราทำเสร็จแล้ว
_(){
แมว /dev/โมฆะ>myfifo;#ว่างๆ myfifo
ผู้บริหาร 3<myfifo;# เปิดไฟล์ myfifo เป็น fd 3
โยนออก 'สวัสดีชาวโลก! - จาก fd 3' >myfifo;#เขียนถึง myfifo
อ่าน -ยู 3;#อ่านบรรทัดจาก fd 3
ผู้บริหาร 3> &-;#ปิดfd3
โยนออก ${ตอบกลับ} # บรรทัดเอาต์พุตอ่านจาก fd 3 ก่อนปิด
}
_# สวัสดีชาวโลก! จาก fd 3
การสร้างรถไฟด้วย file descriptor และอ่าน -u FD
เพื่อความสนุก ฉันตัดสินใจสร้างรถไฟด้วย file descriptor และอ่าน -u FD สำหรับแต่ละ file descriptor จะมีการเขียนตัวเลข file descriptor แต่ละอันจะอ่านจาก file descriptor 1 ด้านล่างและผนวกเข้ากับตัวมันเอง
บรรทัดคำสั่ง
ทุบตีlinuxhint.com/สร้าง/ทดสอบอ่าน fd.sh รถไฟ10เอาท์พุต
กำลังเริ่มต้น fds ...กำลังเริ่มต้นfd3...
fd3กำหนดค่าเริ่มต้น
กำลังเริ่มต้นfd4...
fd4กำหนดค่าเริ่มต้น
fds intialized
อ่านจาก fd3และ4...
4 3
fds ก่อนทำความสะอาด
0 1 2 3 4 5
การทำความสะอาด ...
ทำความสะอาด fds ...
เสร็จแล้วทำความสะอาดfds
fds หลังจากทำความสะอาด
0 1 2 3
ข้ามฟังก์ชันโดยใช้ read -u FD
หากคุณกำลังวิ่ง
uname -ถึงINGW64_NT-10.0DESKTOP-XVVVVVVV 2.7.0(0.307/5/3)
2017.-02-17 14:ยี่สิบx86_64 Msys
ทุบตี --รุ่น
GNUทุบตี, เวอร์ชัน 4.4.12(1)-ปล่อย(x86_64-pc-msys)
อาจเป็นไปได้เนื่องจากข้อบกพร่องในการใช้งานฟังก์ชันการข้ามที่ข้ามบรรทัดต่อไปนี้ในสคริปต์ทุบตีนอกฟังก์ชันก่อนที่จะอ่านแหล่งที่มาของสคริปต์ โปรดทราบว่าไม่สามารถใช้ได้กับระบบส่วนใหญ่ ตัวอย่างเช่น,
uname -ถึงลินุกซ์ 4.9.0-8-amd64#1 เดเบียน SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux
ทุบตี --รุ่น
GNUทุบตี, เวอร์ชัน 4.4.12(1)-ปล่อย(x86_64-pc-linux-gnu)
ข้ามไม่บิน
การทำงาน
ข้าม() { อ่าน -ยู 31;}
คำสั่ง
ข้ามโยนออกข้ามบรรทัด
จริง
เอาท์พุต
(ว่างเปล่า)บรรทัดล่าง
การอ่านในตัวทุบตีทำได้มากกว่าการป้อนข้อมูลของผู้ใช้ สามารถใช้ในฟังก์ชัน ลูป และการแลกเปลี่ยนระหว่างตัวอธิบายไฟล์ที่ใช้ในสคริปต์ทุบตี ในบางครั้งการสำรวจโดยใช้ตัวอธิบายการอ่านและไฟล์อาจทำให้ไข่อีสเตอร์ได้