Skip to main content

Όλα για την εντολή Linux / Unix: expr

Linux Scripting Tutorial 4o - Η εντολή echo και πως χρησιμοποιείται (Ιούνιος 2025)

Linux Scripting Tutorial 4o - Η εντολή echo και πως χρησιμοποιείται (Ιούνιος 2025)
Anonim

Ονομα

expr - Αξιολογήστε μια έκφραση

Σύνοψη

expr arg ? arg arg … ?

Συνενώνει arg (προσθέτοντας διαχωριστικούς χώρους μεταξύ τους), αξιολογεί το αποτέλεσμα ως έκφραση Tcl και επιστρέφει την τιμή. Οι χειριστές που επιτρέπονται στις εκφράσεις Tcl είναι ένα υποσύνολο των χειριστών που επιτρέπονται στις εκφράσεις C και έχουν το ίδιο νόημα και προτεραιότητα με τους αντίστοιχους φορείς C. Οι εκφράσεις σχεδόν πάντοτε αποφέρουν αριθμητικά αποτελέσματα (τιμές ακέραιου ή κυμαινόμενου σημείου). Για παράδειγμα, η έκφραση

expr 8.2 + 6

εκτιμάται σε 14,2. Οι εκφράσεις Tcl διαφέρουν από τις εκφράσεις C με τον τρόπο που καθορίζονται οι τελεστές. Επίσης, οι εκφράσεις Tcl υποστηρίζουν μη-αριθμητικούς τελεστές και συγκρίσεις συμβολοσειρών.

Τα τελεφερίκ

Μια έκφραση Tcl αποτελείται από ένα συνδυασμό τελεστών, χειριστών και παρενθέσεων. Μπορεί να χρησιμοποιηθεί λευκός χώρος μεταξύ των τελεστών και χειριστών και των παρενθέσεων. αγνοείται από τις οδηγίες της έκφρασης. Όπου είναι δυνατόν, οι τελεστές ερμηνεύονται ως ακέραιες τιμές. Οι ακέραιες τιμές μπορούν να οριστούν σε δεκαδική (κανονική περίπτωση), σε οκταδικό (αν είναι ο πρώτος χαρακτήρας του τελεστή0) ή σε δεκαεξαδικό (αν είναι οι δύο πρώτοι χαρακτήρες του τελεστή)0x). Εάν ένας τελεστής δεν έχει μία από τις μορφές ακέραιας που δίδονται παραπάνω, τότε αντιμετωπίζεται σαν ένας αριθμός κινητής υποδιαστολής, αν αυτό είναι δυνατό. Οι αριθμοί κυμαινόμενης θέσης μπορούν να καθορίζονται με οποιονδήποτε από τους τρόπους που γίνονται αποδεκτοί από έναν μεταγλωττιστή C που συμμορφώνεται με το ANSI (εκτός από το ότι τοφά, φά, μεγάλο, καιμεγάλο τα επιθέματα δεν επιτρέπονται στις περισσότερες εγκαταστάσεις). Για παράδειγμα, όλα τα παρακάτω είναι έγκυροι αριθμοί κυμαινόμενου σημείου: 2.1, 3., 6e4, 7.91e + 16. Αν δεν είναι δυνατή η αριθμητική ερμηνεία, τότε ο τελεστής παραμένει ως συμβολοσειρά (και μπορεί να εφαρμοστεί μόνο ένα περιορισμένο σύνολο χειριστών).

Οι τελεστές μπορούν να οριστούν με οποιονδήποτε από τους ακόλουθους τρόπους:

1

Ως αριθμητική τιμή, είτε ακέραιος είτε κυμαινόμενος.

2

Ως μεταβλητή Tcl, χρησιμοποιώντας πρότυπο$ σημειογραφία. Η τιμή της μεταβλητής θα χρησιμοποιηθεί ως ο operand.

3

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

4

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

5

Ως εντολή Tcl που περικλείεται σε παρένθεση. Η εντολή θα εκτελεστεί και το αποτέλεσμά της θα χρησιμοποιηθεί ως τελεστής.

6

Ως μαθηματική συνάρτηση των οποίων τα επιχειρήματα έχουν οποιαδήποτε από τις παραπάνω μορφές για τους τελεστές, όπωςαμαρτία ($ x). Δείτε παρακάτω μια λίστα καθορισμένων λειτουργιών.

Όταν οι υποκαταστάσεις εμφανίζονται παραπάνω (π.χ. εντός των συμβολοσειρών), εκτελούνται με τις οδηγίες της έκφρασης. Ωστόσο, μπορεί να έχει ήδη εκτελεστεί ένα πρόσθετο στρώμα υποκατάστασης από τον αναλυτή εντολών πριν από την κλήση του επεξεργαστή έκφρασης. Όπως αναφέρεται παρακάτω, είναι συνήθως καλύτερο να περικλείονται εκφράσεις σε τιράντες για να εμποδίζεται ο αναλυτής εντολών να κάνει υποκαταστάσεις στο περιεχόμενο.

Για μερικά παραδείγματα απλών εκφράσεων, ας υποθέσουμε τη μεταβλητήένα έχει την τιμή 3 και τη μεταβλητήσιέχει την τιμή 6. Στη συνέχεια, η εντολή στην αριστερή πλευρά κάθε γραμμής παρακάτω θα παράγει την τιμή στη δεξιά πλευρά της γραμμής:

expr 3.1 + $ a6.1 expr 2 + "$ a. $ b" 5.6 expr 4 * llength "6 2" 8 expr {{λέξη ένα} <"λέξη $ α"} 0

Χειριστές

Οι έγκυροι χειριστές παρατίθενται παρακάτω, ομαδοποιημένοι κατά φθίνουσα σειρά προτεραιότητας:

- + ~ !

Unary μείον, unary plus, bit-σοφό NOT, λογικό NOT. Κανένας από αυτούς τους τελεστές δεν μπορεί να εφαρμοστεί στους τελεστές των συμβολοσειρών και το bit-wise NOT μπορεί να εφαρμοστεί μόνο σε ακέραιους αριθμούς.

* / %

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

+ -

Προσθέστε και αφαιρέστε. Ισχύει για κάθε αριθμητικό τελεστή.

<< >>

Αριστερή και δεξιά στροφή. Ισχύει μόνο για ακέραιους τελεστές. Μια δεξιά στροφή μεταδίδει πάντα το σήμα bit.

< > <= >=

Boolean μικρότερη, μεγαλύτερη, μικρότερη ή ίση και μεγαλύτερη ή ίση. Κάθε χειριστής παράγει 1 εάν η κατάσταση είναι αληθής, 0 διαφορετικά. Αυτοί οι χειριστές μπορούν να εφαρμοστούν σε χορδές καθώς και αριθμητικούς τελεστές, οπότε χρησιμοποιείται σύγκριση στοιχειοσειρών.

== !=

Boolean ίσο και όχι ίσο. Κάθε χειριστής παράγει ένα μηδέν / ένα αποτέλεσμα. Ισχύει για όλους τους τύπους οντολογίου.

&

Bit-σοφός ΚΑΙ. Ισχύει μόνο για ακέραιους τελεστές.

^

Σίγουρα αποκλειστικά OR. Ισχύει μόνο για ακέραιους τελεστές.

|

Bit-σοφός Ή. Ισχύει μόνο για ακέραιους τελεστές.

&&

Λογική AND. Παρέχει ένα αποτέλεσμα εάν και οι δύο τελεστές είναι μη μηδέν, 0 διαφορετικά. Ισχύει μόνο για τους τελεστές boolean και αριθμητικούς (ακέραιους αριθμούς ή κυμαινόμενους).

||

Λογική OR. Παρέχει ένα αποτέλεσμα 0 εάν και οι δύο τελεστές είναι μηδέν, 1 διαφορετικά. Ισχύει μόνο για τους τελεστές boolean και αριθμητικούς (ακέραιους αριθμούς ή κυμαινόμενους).

Χ ? y : z

Εάν-τότε-αλλιώς, όπως στο C. Αν Χ υπολογίζεται σε μη μηδέν, τότε το αποτέλεσμα είναι η τιμή του y . Διαφορετικά, το αποτέλεσμα είναι η τιμή του z . ο Χ ο τελεστής πρέπει να έχει αριθμητική τιμή.

Δείτε το εγχειρίδιο C για περισσότερες λεπτομέρειες σχετικά με τα αποτελέσματα που παράγει κάθε χειριστής. Όλες οι ομάδες δυαδικών χειριστών από αριστερά προς τα δεξιά μέσα στο ίδιο επίπεδο προτεραιότητας. Για παράδειγμα, η εντολή

expr 4 * 2 <7

επιστρέφει 0.

ο&&, ||, και?: οι χειριστές έχουν `` τεμπέλη αξιολόγηση '', ακριβώς όπως και στο C, πράγμα που σημαίνει ότι οι τελεστές δεν αξιολογούνται αν δεν είναι απαραίτητοι για τον προσδιορισμό του αποτελέσματος. Για παράδειγμα, στην εντολή

expr {$ v; α: β}

μόνο ένα απόένα ήσι θα αξιολογηθεί, ανάλογα με την αξία του$ v. Σημειώστε, ωστόσο, ότι αυτό ισχύει μόνο αν ολόκληρη η έκφραση περικλείεται σε τιράντες. διαφορετικά, ο αναλυτής Tcl θα αξιολογήσει και τα δύοένα καισι πριν προβείτε στην κλήσηexpr εντολή.

Μαθηματικές λειτουργίες

Το Tcl υποστηρίζει τις ακόλουθες μαθηματικές λειτουργίες στις εκφράσεις:

abs coshκούτσουροsqrt acos διπλόlog10srand όπως λέμε exppowηλιοκαμένος ένα μαύρισμα πάτωμαάκραtanh atan2 fmodστρογγυλό ceil hypotαμαρτία cos intsinh

abs ( arg )

Επιστρέφει την απόλυτη τιμή του arg . Arg μπορεί να είναι είτε ακέραιο είτε κυμαινόμενο, και το αποτέλεσμα επιστρέφεται με την ίδια μορφή.

acos ( arg )

Επιστρέφει το συνημίτονο τόξου του arg , στην ακτίνα 0, pi. Arg θα πρέπει να είναι στην περιοχή -1,1.

όπως λέμε( arg )

Επιστρέφει το ημιτονοειδές τόξο του arg , στην περιοχή των ακτίνων -pi / 2, pi / 2. Arg θα πρέπει να είναι στην περιοχή -1,1.

ένα μαύρισμα( arg )

Επιστρέφει την εφαπτομένη τόξου του arg , στην περιοχή των ακτίνων -pi / 2, pi / 2.

atan2 ( x, y )

Επιστρέφει την εφαπτομένη τόξου του y / Χ , στο εύρος -pi, pi radians. Χ και y δεν μπορεί και οι δύο να είναι 0.

ceil ( arg )

Επιστρέφει τη μικρότερη ακέραια τιμή όχι μικρότερη από arg .

cos ( arg )

Επιστρέφει το συνημίτονο του arg , μετρούμενη σε ακτίνια.

cosh ( arg )

Επιστρέφει το υπερβολικό συνημίτονο του arg . Εάν το αποτέλεσμα θα προκαλέσει υπερχείλιση, επιστρέφεται σφάλμα.

διπλό( arg )

Αν arg είναι μια κυμαινόμενη τιμή, επιστρέφει arg , αλλιώς μετατρέπει arg να κυμαίνεται και να επιστρέφει την τιμή μετατροπής.

exp ( arg )

Επιστρέφει το εκθετικό του arg , που ορίζεται ως e ** arg . Εάν το αποτέλεσμα θα προκαλέσει υπερχείλιση, επιστρέφεται σφάλμα.

πάτωμα( arg )

Επιστρέφει τη μεγαλύτερη ολοκληρωμένη τιμή όχι μεγαλύτερη από arg .

fmod ( x, y )

Επιστρέφει το υπόλοιπο του κυμαινόμενου σημείου της διαίρεσης του Χ με y . Αν y είναι 0, επιστρέφεται σφάλμα.

hypot ( x, y )

Υπολογίζει το μήκος της υποτείνουσας ενός ορθογώνιου τριγώνου ( Χ * Χ + y * y ).

int ( arg )

Αν arg είναι μια ακέραια τιμή, επιστρέφει arg , αλλιώς μετατρέπει arg σε ακέραιο από την περικοπή και επιστρέφει την τιμή μετατροπής.

κούτσουρο( arg )

Επιστρέφει τον φυσικό λογάριθμο του arg . Arg πρέπει να είναι θετική αξία.

log10 ( arg )

Επιστρέφει τον λογάριθμο βάσης 10 του arg . Arg πρέπει να είναι θετική αξία.

pow ( x, y )

Υπολογίζει την τιμή του Χ ανυψωμένο στην εξουσία y . Αν Χ είναι αρνητική, y πρέπει να είναι μια ακέραια τιμή.

άκρα()

Επιστρέφει έναν αριθμό κινητής υποδιαστολής από το μηδέν σε λιγότερο από ένα ή, από μαθηματική άποψη, το εύρος 0,1). Ο σπόρος προέρχεται από το εσωτερικό ρολόι του μηχανήματος ή μπορεί να ρυθμιστεί χειροκίνητα με τη λειτουργία srand.

στρογγυλό( arg )

Αν arg είναι μια ακέραια τιμή, επιστρέφει arg , αλλιώς μετατρέπει arg σε ακέραιο με στρογγυλοποίηση και επιστρέφει την τιμή μετατροπής.

αμαρτία( arg )

Επιστρέφει το ημίτονο του arg , μετρούμενη σε ακτίνια.

sinh ( arg )

Επιστρέφει το υπερβολικό ημίτονο του arg . Εάν το αποτέλεσμα θα προκαλέσει υπερχείλιση, επιστρέφεται σφάλμα.

sqrt ( arg )

Επιστρέφει την τετραγωνική ρίζα του arg . Arg πρέπει να είναι μη αρνητικές.

srand ( arg )

ο arg , που πρέπει να είναι ακέραιος, χρησιμοποιείται για την επαναφορά του σπόρου για τη γεννήτρια τυχαίων αριθμών. Επιστρέφει τον πρώτο τυχαίο αριθμό από αυτόν τον σπόρο. Κάθε διερμηνέας έχει δικό του σπόρο.

ηλιοκαμένος( arg )

Επιστρέφει την εφαπτομένη του arg , μετρούμενη σε ακτίνια.

tanh ( arg )

Επιστρέφει την υπερβολική εφαπτομένη του arg .

Εκτός από αυτές τις προκαθορισμένες λειτουργίες, οι εφαρμογές μπορούν να ορίσουν πρόσθετες λειτουργίες χρησιμοποιώνταςTcl_CreateMathFunc().

Τύποι, υπερχείλιση και ακρίβεια

Όλοι οι εσωτερικοί υπολογισμοί που αφορούν ακέραιους αριθμούς γίνονται με τον τύπο C μακρύς , και όλοι οι εσωτερικοί υπολογισμοί που αφορούν το κινητό σημείο γίνονται με τον τύπο C διπλό . Κατά τη μετατροπή μιας συμβολοσειράς σε κινητό σημείο, ανιχνεύεται υπερχείλιση εκθέτη και οδηγεί σε σφάλμα Tcl. Για τη μετατροπή σε ακέραιο από συμβολοσειρά, η ανίχνευση υπερχείλισης εξαρτάται από τη συμπεριφορά ορισμένων ρουτινών στην τοπική βιβλιοθήκη C, επομένως πρέπει να θεωρείται αναξιόπιστη. Σε κάθε περίπτωση, η υπερχείλιση ακέραιων αριθμών και η υπορροή γενικά δεν ανιχνεύονται αξιόπιστα για ενδιάμεσα αποτελέσματα. Η υπερχείλιση και η υπορροή των κυμαινόμενων σημείων ανιχνεύονται στο βαθμό που υποστηρίζεται από το υλικό, το οποίο είναι γενικά αρκετά αξιόπιστο.

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

expr 5/4

επιστρέφει 1, ενώ

expr 5 / 4.0 expr 5 / (μήκος γραμμής "abcd" + 0.0)

και οι δύο επιστρέφουν 1,25. Οι τιμές κυμαινόμενου σημείου επιστρέφονται πάντοτε με ένα ``.'' ή έναμι έτσι ώστε να μην μοιάζουν με ακέραιες αξίες. Για παράδειγμα,

expr 20,0 / 5,0

επιστρέφει4.0, δεν4.

Λειτουργίες στοιχειοσειρών

Οι τιμές των συμβολοσειρών μπορούν να χρησιμοποιηθούν ως τελεστές των χειριστών σύγκρισης, αν και ο αξιολογητής έκφρασης προσπαθεί να κάνει συγκρίσεις ως ακέραιο ή κυμαινόμενο σημείο όταν μπορεί. Αν ένας από τους τελεστές μιας σύγκρισης είναι μια συμβολοσειρά και ο άλλος έχει μια αριθμητική τιμή, ο αριθμητικός τελεστής μετατρέπεται πίσω σε μια συμβολοσειρά χρησιμοποιώντας το C sprintf προδιαγραφέας μορφοποίησης%ρε για ακέραιους αριθμούς και%σολ για τιμές κυμαινόμενου σημείου. Για παράδειγμα, οι εντολές

expr {"0x03"> "2"} expr {"0y" <"0x12"}

και οι δύο επιστρέφουν 1. Η πρώτη σύγκριση γίνεται με χρήση σύγκρισης ακέραιων αριθμών και η δεύτερη γίνεται χρησιμοποιώντας τη σύγκριση συμβολοσειρών αφού ο δεύτερος τελεστής μετατρέπεται σε συμβολοσειρά18. Λόγω της τάσης της Tcl να επεξεργάζεται αξίες ως αριθμούς όποτε είναι δυνατόν, δεν είναι γενικά καλή ιδέα να χρησιμοποιηθούν οι χειριστές όπως==όταν θέλετε πραγματικά σύγκριση συμβολοσειρών και οι τιμές των τελεστών θα μπορούσαν να είναι αυθαίρετες. είναι καλύτερα σε αυτές τις περιπτώσεις να χρησιμοποιήσετε τοσειρά εντολή αντ 'αυτού.

Επιδόσεις απόδοσης

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

Όπως αναφέρθηκε παραπάνω, οι εκφράσεις αντικαθίστανται δύο φορές: μία φορά από τον αναλυτή Tcl και μία φορά από το expr εντολή. Για παράδειγμα, οι εντολές

ορίστε ένα 3 ρυθμίστε b {$ a + 2} expr $ b * 4

επιστροφή 11, όχι πολλαπλάσιο του 4. Αυτό οφείλεται στο γεγονός ότι ο αναλυτής Tcl θα αντικαταστήσει πρώτα$ α + 2 για τη μεταβλητήσι, μετά τοexpr εντολή θα αξιολογήσει την έκφραση$ α + 2 * 4.

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

Λέξεις κλειδιά

αριθμητική, boolean, σύγκριση, έκφραση, ασαφής σύγκριση

Σπουδαίος: Χρησιμοποιήστε το άνδρας εντολή ( % άνδρας ) για να δείτε πώς χρησιμοποιείται μια εντολή στον υπολογιστή σας.