Εντολή ανάγνωσης Bash

Bash Read Command



Διαβάστε ή πεθάνετε φίλοι. Η εντολή ανάγνωσης είναι εξίσου σημαντική με τις παραμέτρους θέσης και την εντολή ηχώ. Πώς αλλιώς πρόκειται να πιάσετε την είσοδο του χρήστη, να αποδεχτείτε κωδικούς πρόσβασης, να γράψετε συναρτήσεις, να κάνετε βρόχο και να κοιτάξετε σε περιγραφείς αρχείων; Συνέχισε να διαβάζεις.

Τι διαβάζεται;

Η ανάγνωση είναι μια ενσωματωμένη εντολή bash που διαβάζει το περιεχόμενο μιας γραμμής σε μια μεταβλητή. Επιτρέπει το διαχωρισμό λέξεων που είναι συνδεδεμένο με την ειδική μεταβλητή κελύφους IFS. Χρησιμοποιείται κυρίως για την πρόσληψη εισόδου χρήστη, αλλά μπορεί να χρησιμοποιηθεί για την εφαρμογή συναρτήσεων που λαμβάνουν είσοδο από την τυπική είσοδο.







Bash ανάγνωση ενσωματωμένης βοήθειας εντολών

Πριν εμβαθύνουμε στο πώς να χρησιμοποιήσουμε την εντολή ανάγνωσης σε σενάρια bash, εδώ είναι ο τρόπος με τον οποίο λαμβάνουμε βοήθεια. Εκεί θα πρέπει να δείτε όλες τις διαθέσιμες επιλογές για την εντολή ανάγνωσης μαζί με περιγραφές που θα προσπαθήσουμε να καλύψουμε στα παραδείγματα.



Γραμμή εντολών



βοήθεια ανάγνωση

Παραγωγή





ανάγνωση:ανάγνωση [-οι] [-μια συστοιχία] [-δ μερίδιο] [-i κείμενο] [-ν νχαρς] [-N nchars]
[-p εντολή] [-t timeout] [-u fd] [όνομα ...]

Διαβάστε μια γραμμή από την τυπική είσοδο καιδιαίρεσηστα χωράφια.

Διαβάζει μια μόνο γραμμή από την τυπική είσοδο ή απόαρχείοπεριγραφέας FD
ανο-uπαρέχεται η επιλογή. Η γραμμή είναιδιαίρεσησε χωράφιαόπως καιμε λέξη
διαχωρισμός και η πρώτη λέξη εκχωρείται στο πρώτο ΟΝΟΜΑ, στη δεύτερη
λέξη στο δεύτερο ΟΝΟΜΑ, και ούτω καθεξής, με τις υπόλοιπες λέξεις που έχουν εκχωρηθεί
οτελευταίοςΟΝΟΜΑ. Βρέθηκαν μόνο οι χαρακτήρεςσε $ IFSαναγνωρίζονταιόπως καιλέξη
οριοθετητές.

Εάν δεν παρέχονται NAME, η γραμμήανάγνωσηείναι αποθηκευμένοσεη μεταβλητή ΑΠΑΝΤΗΣΗ.

Επιλογές:
-προς τοπίνακας αντιστοιχίστε τις λέξειςανάγνωσησε διαδοχικούς δείκτες του πίνακα
μεταβλητή ARRAY, ξεκινώντας από το μηδέν
-ρεντελίμνα συνεχίσει μέχριο πρώτος χαρακτήρας του DELIM είναιανάγνωση, μάλλον
από τη νέα γραμμή
-e χρησιμοποιήστε το Readline για να αποκτήσετε τη γραμμήσεένα διαδραστικό κέλυφος
-Εγώχρήση κειμένου TEXTόπως καιτο αρχικό κείμενοΓιαΓραμμή ανάγνωσης
νχαρςΕΠΙΣΤΡΟΦΗαφού διάβασες χαρακτήρες NCHARS παρά περιμένω
Γιαμια νέα γραμμή, αλλά τιμήστε έναν οριοθέτηανλιγότερα από

Οι χαρακτήρες NCHARS είναιανάγνωσηπριν από τον οριοθέτη
νχαρςΕΠΙΣΤΡΟΦΗμόνο αφού διαβάσετε ακριβώς τους χαρακτήρες NCHARS, εκτός αν
ΕΟΦ συναντάται ήανάγνωση φορέςέξω, αγνοώντας κανένα
οριοθετητής
γρήγορη έξοδο της συμβολοσειράς PROMPT χωρίς προηγούμενη νέα γραμμή
προσπαθώ ναανάγνωση
-rκάνωνα μην επιτρέπεται η ανάκρουση να ξεφεύγει από τους χαρακτήρες
-μικρόκάνωδενπέταξε έξωείσοδο που προέρχεται από ένα τερματικό
-tτέλος χρόνουχρόνοςέξω καιΕΠΙΣΤΡΟΦΗαποτυχίαανπρος τοπλήρηςγραμμή του
η εισαγωγή δεν είναιανάγνωσηεντός TIMEOUT δευτερολέπτων. Η αξία του
Η μεταβλητή TMOUT είναι το προεπιλεγμένο χρονικό όριο. Το TIMEOUT μπορεί να είναι α
κλασματικός αριθμός. Αν είναι TIMEOUT0,ανάγνωσηεπιστρέφει
αμέσως, χωρίς να το προσπαθήσωανάγνωσητυχόν δεδομένα, επιστροφή
επιτυχία μόνοανη είσοδος είναι διαθέσιμη στο καθορισμένο
αρχείοπεριγραφέας. οέξοδοςη κατάσταση είναι μεγαλύτερη από128
ανξεπεραστεί το χρονικό όριο
-ufdανάγνωσηαπόαρχείοπεριγραφέας FD αντί της τυπικής εισόδου

Κατάσταση εξόδου:
οΕΠΙΣΤΡΟΦΗο κωδικός είναι μηδενικός, εκτός αν συναντήσετε το τέλος του αρχείου,ανάγνωση φορέςέξω
(σε οι οποίες υπόθεσητοείναι μεγαλύτερη από 128), ένα σφάλμα μεταβλητής εκχώρησης

Προσέγγιση εισόδου χρήστη

Τα διαδραστικά σενάρια bash δεν είναι τίποτα χωρίς να εισπράττουν την είσοδο του χρήστη. Η ενσωματωμένη ανάγνωση παρέχει μεθόδους για την είσοδο των χρηστών σε ένα σενάριο bash.

Πιάνοντας μια γραμμή εισόδου

Για να πιάσετε μια γραμμή εισόδου NAME και οι επιλογές δεν απαιτούνται από ανάγνωση. Όταν το NAME δεν είναι καθορισμένο, χρησιμοποιείται μια μεταβλητή με το όνομα REPLY για την αποθήκευση των εισόδων χρήστη.



Εντολές

{
πέταξε έξω 'Πληκτρολογήστε κάτι και πατήστε enter:'?
ανάγνωση?
πέταξε έξωΠληκτρολογήσατε$ {REPLY}
}

Παραγωγή

Πληκτρολογήστε κάτι και πατήστε enter: κάτι(νέα γραμμή)
Έγραψες κάτι

Πιάνοντας μια λέξη εισόδου

Για να καταλάβετε μια λέξη εισόδου, απαιτείται η επιλογή -d. Στην περίπτωση μιας λέξης ορίζαμε -d σε κενό, διαβάζαμε ‘-d’. Αυτό συμβαίνει όταν ο χρήστης πατήσει το πλήκτρο διαστήματος που διαβάζεται θα φορτώσει ΑΠΑΝΤΗΣΗ με τη λέξη.

Σημειώστε ότι όταν οριστεί η επιλογή -d, το backspace δεν λειτουργεί όπως αναμενόταν. Για να κάνετε πίσω, ενώ προσπαθείτε να πιάσετε μια λέξη εισόδου, μπορεί να χρησιμοποιηθεί η επιλογή -e, διαβάστε -e ‘-d’.

Εντολές

{
πέταξε έξω 'Πληκτρολογήστε κάτι και χτυπήστε χώρο:'?
ανάγνωση '-δ'?
πέταξε έξω ''?
πέταξε έξω 'Πληκτρολογήσατε$ {REPLY}'
}

Παραγωγή

Πληκτρολογήστε κάτι και χτυπήστε χώρο: κάτι(χώρος)
Έγραψες κάτι

Άμεσος χρήστης

Σε διαδραστικά σενάρια bash που ζητούν από έναν χρήστη να απαιτήσει ένα μήνυμα για να πει στον χρήστη ποια είσοδος αναμένεται. Μπορούμε πάντα να το πετύχουμε χρησιμοποιώντας την ενσωματωμένη ηχώ. Ωστόσο, αποδεικνύεται ότι υπάρχει μια επιλογή χρησιμοποιώντας την ανάγνωση.

Προτροπή χρήστη για μια λέξη

Για να πιάσουμε μια λέξη εισόδου, χρησιμοποιήσαμε την ηχώ για να γράψουμε Πληκτρολογήστε κάτι και πατήστε κενό: στην τυπική έξοδο πριν διαβάσετε το ‘-d’. Η επιλογή -p επιτρέπει την εμφάνιση ενός μηνύματος πριν από την ανάγνωση από την τυπική είσοδο.

Εντολές

{
ανάγνωση 'Πληκτρολογήστε κάτι και χτυπήστε χώρο:' '-δ'?
πέταξε έξω ''?
πέταξε έξω 'Πληκτρολογήσατε$ {REPLY}'
}

Παραγωγή

Πληκτρολογήστε κάτι και χτυπήστε χώρο: κάτι(χώρος)
Έγραψες κάτι

Άμεσος χρήστης για ένα μυστικό

Όταν πιάνετε την είσοδο χρήστη χωρίς να εμφανίζεται στο τερματικό, η επιλογή -s είναι χρήσιμη. Η ανάγνωση -s -p σάς επιτρέπει να καταγράφετε και να αποκρύπτετε την είσοδο του χρήστη ως εξής.

Εντολές

{
ανάγνωση -μικρό 'Πληκτρολογήστε κάτι που υπόσχομαι να το κρατήσω μυστικό:'
πέταξε έξω ''?
πέταξε έξω «Το μυστικό σου είναι ασφαλές μαζί μου»?μη ρυθμισμένοςΑΠΑΝΤΗΣΗ
πέταξε έξω '$ {REPLY}'
}

Παραγωγή

Πληκτρολογήστε κάτι που υπόσχομαι να το κρατήσω μυστικό:
Το μυστικό σου είναι ασφαλές μαζί μου

Λειτουργίες χρησιμοποιώντας ανάγνωση

Ακολουθούν παραδείγματα συναρτήσεων στο bash που χρησιμοποιούν ανάγνωση και τυπική είσοδο

Βασική έννοια

Οι συναρτήσεις που χρησιμοποιούν την ανάγνωση χρησιμοποιούν τυπική εισαγωγή και παραμέτρους με σωληνώσεις. Η κύρια είσοδος προς επεξεργασία, όπως οι γραμμές σε ένα αρχείο, περνούν μέσω της τυπικής εισόδου μέσω ενός σωλήνα. Άλλες εισαγωγές εάν-οποιαδήποτε και η επιλογή μεταφέρονται ως παράμετροι.

ανάγνωση -t 1NAME1 NAME2 ...

ανάγνωσηείναι έναενσωματωμένο εντολή

-t 1 εμποδίζει το σενάριο bash να περιμένει επ 'αόριστον την επιστροφή μιας γραμμής μέσω της τυπικής εισαγωγής. Εάν η τυπική είσοδος είναι αρχικά κενή, η συνάρτηση επιστρέφει με κωδικό εξόδου 142 που σημαίνει ότι δεν έχει διαβαστεί ημερομηνία εντός της καθορισμένης χρονικής περιόδου λήξης

Το NAME1 NAME2 είναι ονόματα μεταβλητών

... πολλά ονόματα μεταβλητών ενδέχεται να παρατίθενται

Τώρα που έχουν τεθεί τα θεμέλια, ας δούμε πώς μοιάζουν οι γνωστές συναρτήσεις που υλοποιούνται χρησιμοποιώντας την ανάγνωση.

Συνδέστε τη λειτουργία χρησιμοποιώντας την ανάγνωση

Ας υποθέσουμε ότι θέλουμε μια συνάρτηση σύνδεσης που λαμβάνει μια λίστα με λέξεις και επιστρέφει μια άλλη λίστα λέξεων που συνδέονται με έναν οριοθέτη. Εδώ είναι πώς μπορούμε να εφαρμόσουμε μια συνάρτηση σύνδεσης χρησιμοποιώντας την ανάγνωση.

Γραφή

#!/bin/bash
## Συμμετοχή
## έκδοση 0.0.2 - διόρθωση παραμέτρων αναδρομής
################################################### #
Συμμετοχή() { { τοπικόςπεριοριστής?περιοριστής='$ {1-}'?τοπικόςυπερβολικό όριο
υπερπεριορισμος='$ {2-.}'?}
τοπικόςαυτοκίνητο
τοπικόςcdr
τοπικόςIFS
IFS='$ {indelimiter}'
ανάγνωση -t 1cdr αυτοκινήτου|| ΕΠΙΣΤΡΟΦΗ
δοκιμή '$ {cdr}' || { πέταξε έξω '$ {car}'?ΕΠΙΣΤΡΟΦΗ?}
πέταξε έξω '$ {car}$ {outdelimiter}$ {cdr}' | $ {FUNCNAME} '$ {indelimiter}'
'$ {outdelimiter}'
}
################################################### #
## που δημιουργήθηκε από το create-stub2.sh v0.1.2
## στις Δευ, 17 Ιουνίου 2019 12:24:59 +0900
## βλέπω
################################################### #

Πηγή: join.sh
Γραμμή εντολών

πέταξε έξωα β| Συμμετοχή

Παραγωγή

α.β

Γραμμή εντολών

πέταξε έξωα β| Συμμετοχή | ΣυμμετοχήΤο |

Παραγωγή

προς το|σι

Λειτουργίες χάρτη χρησιμοποιώντας ανάγνωση

Ας υποθέσουμε ότι θέλουμε μια συνάρτηση χάρτη που παίρνει μια λίστα και επιστρέφει μια άλλη λίστα που περιέχει τον ίδιο αριθμό στοιχείων που τροποποιούνται από άλλη συνάρτηση. Εδώ είναι πώς μπορούμε να εφαρμόσουμε μια συνάρτηση χάρτη χρησιμοποιώντας την ανάγνωση.

Γραφή

#!/bin/bash
## χάρτης
## έκδοση 0.0.1 - αρχική
################################################### #
χάρτης() { { τοπικόςόνομα_χρήσης;όνομα_λειτουργίας='$ {1}'?}
τοπικόςαυτοκίνητο
τοπικόςcdr
τοπικόςIFS
IFS='$ {indelimiter-}'
ανάγνωση -t 1cdr αυτοκινήτου|| ΕΠΙΣΤΡΟΦΗ
δοκιμή '$ (δηλώστε -f $ {function_name})' || ΕΠΙΣΤΡΟΦΗ
δοκιμή '$ {car}' || { αληθής?ΕΠΙΣΤΡΟΦΗ?}
$ {function_name} $ {car}
πέταξε έξω '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
################################################### #
## που δημιουργήθηκε από το create-stub2.sh v0.1.2
## Τρί, 18 Ιουνίου 2019 08:33:49 +0900
## βλέπω
################################################### #

Πηγή: χάρτης.σ
Εντολές

NS() { τοπικός -Εγώ Εγώ=$ {1}?πέταξε έξω$((Εγώ** 2 ))?}
πέταξε έξω {1..10} |map pow

Παραγωγή

1
4
9
16
25
36
49
64
81
100

Λειτουργία φιλτραρίσματος χρησιμοποιώντας ανάγνωση

Ας υποθέσουμε ότι θέλουμε μια συνάρτηση φίλτρου που παίρνει μια λίστα και επιστρέφει μια υπο λίστα με τις συνθήκες που ικανοποιούν συνθήκες που έχει οριστεί από μια άλλη συνάρτηση. Δείτε πώς μπορούμε να εφαρμόσουμε μια λειτουργία φίλτρου χρησιμοποιώντας την ανάγνωση.

Γραφή

#!/bin/bash
## φίλτρο
## έκδοση 0.0.1 - αρχική
################################################### #
φίλτρο() { { τοπικόςόνομα_χρήσης;όνομα_λειτουργίας='$ {1}'?}
τοπικόςαυτοκίνητο
τοπικόςcdr
τοπικόςIFS
IFS='$ {indelimiter-}'
ανάγνωση -t 1cdr αυτοκινήτου|| ΕΠΙΣΤΡΟΦΗ
δοκιμή '$ (δηλώστε -f $ {function_name})' || ΕΠΙΣΤΡΟΦΗ
δοκιμή '$ {car}' || { αληθής?ΕΠΙΣΤΡΟΦΗ?}
$ {function_name} '$ {car}' || πέταξε έξω '$ {car}'
πέταξε έξω '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
################################################### #
## που δημιουργήθηκε από το create-stub2.sh v0.1.2
## την Τρί, 18 Ιουνίου 2019 13:19:54 +0900
## βλέπω
################################################### #

Πηγή: φίλτρο.σ

Εντολές

Περιττός() { τοπικός -Εγώ Εγώ=$ {1}?δοκιμή !$((Εγώ% 2 )) -ισοδύναμο 1?}
πέταξε έξω {1..10} |φίλτρο περίεργο

Παραγωγή

1 3 5 7 9

Βρόχοι χρησιμοποιώντας ανάγνωση

Οι βρόχοι που χρησιμοποιούν την ανάγνωση σάς επιτρέπουν να επαναλαμβάνετε τις γραμμές ενός αρχείου που πρόκειται να δημιουργηθεί ή υπάρχει ήδη.

Βασικός βρόχος κατά την ανάγνωση για την αριστερή πλευρά (lhs)

Έχουμε μια εντολή ή μια συνάρτηση (lhs) που μπορεί να δημιουργήσει γραμμές σε ένα αρχείο που μπορεί να περιτυλιχθεί μέσω του βρόχου ανάγνωσης και ενός διαστήματος.

Κατασκευάσει

lhs| ενώ ανάγνωση
κάνω
αληθής
Έγινε
lhs είναι αεντολήπου επιστρέφει μια λίστα γραμμών

Εντολές

εφ 5 | ενώ ανάγνωσηΕγώ
κάνω
πέταξε έξω $ {i}
Έγινε

Παραγωγή

1
2
3
4
5

Βασικός βρόχος κατά την ανάγνωση για τη δεξιά πλευρά (rhs)

Έχουμε ένα αρχείο (rhs) με γραμμές που μπορούν να περιστραφούν μέσω του βρόχου ανάγνωσης και λίγο.

Κατασκευάσει

ενώ ανάγνωση
κάνω
αληθής
Έγινε <rhs

rhs είναι ααρχείοπου περιέχουν γραμμές

Εντολές

εφ 5 >>rhs
ενώ ανάγνωσηΕγώ
κάνω
πέταξε έξω $ {i}
Έγινε <rhs

Παραγωγή

1
2
3
4
5

Προσαρμοσμένο lhs κατά τη διάρκεια του βρόχου χρησιμοποιώντας την ανάγνωση

Έχουμε ένα ρεύμα λέξεων που θα θέλαμε να βολέψουμε μέσω της ανάγνωσης.

Κατασκευάσει

(
IFS=''
lhs| ενώ ανάγνωση
κάνω
αληθής
Έγινε
)

lhs είναι μια λίστα με λέξεις

Εντολές

(
IFS=''
πέταξε έξω {1..5} | ενώ ανάγνωσηΕγώ
κάνω
πέταξε έξω '$ {i}
Έγινε
)

Παραγωγή

1 2 3 4 5

Ανάγνωση από οποιοδήποτε fd αντί για τυπική είσοδο

Η επιλογή ενσωματωμένης ανάγνωσης που συχνά παραμένει ανέγγιχτη είναι αυτή που σας επιτρέπει να καθορίσετε από ποιον περιγραφέα αρχείων θα διαβάσετε, read -u FD. Από προεπιλογή, το FD θεωρείται τυπική είσοδος.

Βασική έννοια

Όταν ανοίγει ένα αρχείο εκχωρούνται περιγραφείς αρχείων. Η ανακατεύθυνση IO στο bash επιτρέπει σε ένα αρχείο να παραμείνει ανοιχτό με έναν συγκεκριμένο περιγραφέα αρχείων. Μας επιτρέπεται να γράφουμε στο αρχείο, να διαβάζουμε από αυτό και να το κλείνουμε όταν τελειώσουμε.

_()
{
Γάτα /dev/μηδενικό>>myfifo?# κενό myfifo
εκτελ 3<myfifo?# άνοιγμα αρχείου myfifo ως fd 3
πέταξε έξω 'Γειά σου Κόσμε! - από fd 3 ' >>myfifo?# γράψτε στο myfifo
ανάγνωση -u 3?# γραμμή ανάγνωσης από το fd 3
εκτελ 3> &-?# κλείσιμο fd 3
πέταξε έξω $ {REPLY} # γραμμή εξόδου που διαβάζεται από το fd 3 πριν κλείσει
}
_# Γειά σου Κόσμε! από fd 3

Κατασκευή τρένου με περιγραφείς αρχείων και read -u FD

Απλώς για διασκέδαση αποφάσισα να φτιάξω ένα τρένο με περιγραφείς αρχείων και να διαβάσω -u FD. Σε κάθε περιγραφέα αρχείων γράφεται ένας αριθμός. Κάθε περιγραφέας αρχείων διαβάζει από τον περιγραφέα αρχείου 1 παρακάτω και προσαρτάται στον εαυτό του.

Γραμμή εντολών

κτυπώ δυνατάlinuxhint.com/χτίζω/test-read-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

Αν τρέχετε

Το όνομα σου -προς το
MINGW64_NT-10.0DESKTOP-XVVVVVV 2.7.0(0,307/5/3)
2017-02-17 14:είκοσιx86_64 Msys
κτυπώ δυνατά --εκδοχή
ΑΝΤΙΛΟΠΗΣ ΤΗΣ ΑΦΡΙΚΗΣκτυπώ δυνατά, έκδοση 4.4.12(1)-ελευθέρωση(x86_64-pc-msys)

μπορεί να είναι δυνατό λόγω σφάλματος να υλοποιήσετε μια λειτουργία παράλειψης που παραλείπει την ακόλουθη γραμμή σε ένα σενάριο bash εκτός συναρτήσεων πριν από την ανάγνωση της πηγής δέσμης ενεργειών. Σημειώστε ότι δεν λειτουργεί στα περισσότερα συστήματα. Για παράδειγμα,

Το όνομα σου -προς το
Linux 4.9.0-8-amd64#1 Debian SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux
κτυπώ δυνατά --εκδοχή
ΑΝΤΙΛΟΠΗΣ ΤΗΣ ΑΦΡΙΚΗΣκτυπώ δυνατά, έκδοση 4.4.12(1)-ελευθέρωση(x86_64-pc-linux-gnu)

το skip δεν πετάει.

Λειτουργία

παραλείπω() { ανάγνωση -u 31?}

Εντολές

παραλείπω
πέταξε έξωη γραμμή παραλείφθηκε
αληθής

Παραγωγή

(αδειάζω)

Συμπέρασμα

Η ανάγνωση ενσωματωμένη στο bash κάνει περισσότερα από την πρόσληψη εισόδου χρήστη. Μπορεί να χρησιμοποιηθεί σε συναρτήσεις, βρόχους και ανταλλαγές μεταξύ περιγραφών αρχείων που χρησιμοποιούνται σε σενάρια bash. Κατά περιόδους η εξερεύνηση χρησιμοποιώντας περιγραφείς ανάγνωσης και αρχείου μπορεί να αποφέρει πασχαλινά αυγά.