Εντολή Linux / Unix: expr

Ονομα

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

Σύνοψη

expr arg ? arg arg ... ;

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

expr 8.2 + 6

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

Τα τελεφερίκ

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

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

[1]

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

[2]

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

[3]

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

[4]

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

[5]

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

[6]

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

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

Για μερικά παραδείγματα απλών εκφράσεων, υποθέστε ότι η μεταβλητή a έχει την τιμή 3 και η μεταβλητή b έχει την τιμή 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 και αριθμητικούς (ακέραιους αριθμούς ή κυμαινόμενους).

x ; y : z

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

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

expr 4 * 2 <7

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

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

expr {$ v; [α]: [β]}

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

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

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

ABS cosh log sqrt acos διπλό log10 srand asin exp pow tan atan δάπεδο rand tanh atan2 fmod στρογγυλή οροφή hypot sin cos int sinh

abs ( arg )

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

acos ( arg )

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

asin ( arg )

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

atan ( arg )

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

atan2 ( χ, γ )

Επιστρέφει την εφαπτομένη τόξου y / x , στην περιοχή [-pi, pi] radians. x και y δεν μπορούν να είναι και τα δύο.

ceil ( arg )

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

cos ( arg )

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

cosh ( arg )

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

διπλό ( arg )

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

exp ( arg )

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

πάτωμα ( arg )

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

fmod ( χ, γ )

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

hypot ( x, y )

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

int ( arg )

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

log ( arg )

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

log10 ( arg )

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

pow ( x, y )

Υπολογίζει την τιμή του x που ανυψώνεται στη δύναμη y . Εάν το x είναι αρνητικό, το y πρέπει να είναι ακέραιος αριθμός.

άκρα()

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

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

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

sin ( arg )

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

sinh ( arg )

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

sqrt ( arg )

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

srand ( arg )

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

tan ( 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. Οι τιμές κυμαινόμενου σημείου επιστρέφονται πάντοτε με ένα `` . '' ή ένα e έτσι ώστε να μην μοιάζουν με ακέραιες αξίες. Για παράδειγμα,

expr 20,0 / 5,0

επιστρέφει 4.0 , όχι 4 .

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

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

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

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

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

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

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

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

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

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

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

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

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