ทุบตีอ่านคำสั่ง

Bash Read Command



อ่านหรือตายเพื่อน คำสั่ง read มีความสำคัญพอๆ กับพารามิเตอร์ตำแหน่งและคำสั่ง echo คุณจะจับอินพุตของผู้ใช้ ยอมรับรหัสผ่าน เขียนฟังก์ชัน วนซ้ำ และแอบดูไฟล์อธิบายได้อย่างไร อ่านต่อ.

อ่านว่าอะไร?

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
คำสั่ง

NS() { ท้องถิ่น -ผม ผม=$ {1};โยนออก$((ผม** 2 ));}
โยนออก {1..10} |แผนที่พาว

เอาท์พุต

1
4
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}
เสร็จแล้ว

เอาท์พุต

1
2
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;}

คำสั่ง

ข้าม
โยนออกข้ามบรรทัด
จริง

เอาท์พุต

(ว่างเปล่า)

บรรทัดล่าง

การอ่านในตัวทุบตีทำได้มากกว่าการป้อนข้อมูลของผู้ใช้ สามารถใช้ในฟังก์ชัน ลูป และการแลกเปลี่ยนระหว่างตัวอธิบายไฟล์ที่ใช้ในสคริปต์ทุบตี ในบางครั้งการสำรวจโดยใช้ตัวอธิบายการอ่านและไฟล์อาจทำให้ไข่อีสเตอร์ได้