Όλα για την Εντολή Linux/Unix: expr
ο expr χρησιμότητα για το Linux Το κέλυφος συνενώνει ορίσματα και στη συνέχεια αξιολογεί το αποτέλεσμα ως έκφραση Tcl, επιστρέφοντας την τιμή στην τυπική έξοδο.
Οι τελεστές που επιτρέπονται στις εκφράσεις Tcl είναι ένα υποσύνολο των τελεστών που επιτρέπονται στις εκφράσεις C και έχουν την ίδια σημασία και προτεραιότητα με τους αντίστοιχους τελεστές C. Εκφράσεις σχεδόν πάντα δίνουν αριθμητικά αποτελέσματα (ακέραιες ή τιμές κινητής υποδιαστολής).

Σύνοψη
Η εντολή έχει την ακόλουθη γενική μορφή:
expr arg1 arg2 ...
τελεστές
Μια έκφραση Tcl αποτελείται από έναν συνδυασμό τελεστών, τελεστών και παρενθέσεων. Μπορεί να χρησιμοποιηθεί λευκό διάστημα μεταξύ των τελεστών και των τελεστών και των παρενθέσεων. αγνοείται από τις οδηγίες της έκφρασης.
Όπου είναι δυνατόν, οι τελεστές ερμηνεύονται ως ακέραιες τιμές. Οι ακέραιες τιμές μπορούν να καθοριστούν σε δεκαδικό (η κανονική περίπτωση), σε οκταδικό (αν ο πρώτος χαρακτήρας του τελεστή είναι 0), ή σε δεκαεξαδικό (αν είναι οι δύο πρώτοι χαρακτήρες του τελεστή
Οι αριθμοί κινητής υποδιαστολής μπορούν να καθοριστούν με οποιονδήποτε από τους τρόπους που γίνονται δεκτοί από έναν μεταγλωττιστή C συμβατό με ANSI (εκτός από το φά, φά, μεγάλο, και μεγάλο τα επιθήματα δεν θα επιτρέπονται στις περισσότερες εγκαταστάσεις). Για παράδειγμα, όλα τα παρακάτω είναι έγκυροι αριθμοί κινητής υποδιαστολής: 2.1, 3., 6ε4, 7,91e+16. Εάν δεν είναι δυνατή η αριθμητική ερμηνεία, τότε ένας τελεστής αφήνεται ως συμβολοσειρά και μόνο ένα περιορισμένο σύνολο τελεστών μπορεί να εφαρμοστεί σε αυτό.
Οι τελεστές μπορούν να καθοριστούν με οποιονδήποτε από τους ακόλουθους τρόπους:
- Ως αριθμητική τιμή, είτε ακέραιος είτε κινητής υποδιαστολής.
- Ως μεταβλητή Tcl, χρησιμοποιώντας τυπικό $ σημειογραφία. Η τιμή της μεταβλητής θα χρησιμοποιηθεί ως τελεστής.
- Ως συμβολοσειρά που περικλείεται σε διπλά εισαγωγικά. Ο αναλυτής εκφράσεων θα εκτελέσει αντικαταστάσεις ανάστροφης κάθετου, μεταβλητής και εντολών στις πληροφορίες μεταξύ των εισαγωγικών και θα χρησιμοποιήσει την τιμή που προκύπτει ως τελεστή.
- Ως κορδόνι κλεισμένο σε τιράντες. Οι χαρακτήρες μεταξύ της ανοιχτής αγκύλης και της αντίστοιχης αγκύλης θα χρησιμοποιηθούν ως τελεστής χωρίς καμία αντικατάσταση.
- Ως εντολή Tcl που περικλείεται σε αγκύλες. Η εντολή θα εκτελεστεί και το αποτέλεσμά της θα χρησιμοποιηθεί ως τελεστής.
- Ως μαθηματική συνάρτηση της οποίας τα ορίσματα έχουν οποιαδήποτε από τις παραπάνω μορφές για τελεστές, όπως π.χ αμαρτία ($x).
Όπου προκύπτουν αντικαταστάσεις παραπάνω (π.χ. μέσα σε συμβολοσειρές σε εισαγωγικά), εκτελούνται από τις οδηγίες της έκφρασης. Ωστόσο, ένα επιπλέον επίπεδο αντικατάστασης μπορεί να έχει ήδη εκτελεστεί από τον αναλυτή εντολών πριν από την κλήση του επεξεργαστή έκφρασης.
Για μερικά παραδείγματα απλών εκφράσεων, ας υποθέσουμε τη μεταβλητή ένα έχει την τιμή 3 και τη μεταβλητή σι έχει την τιμή 6. Στη συνέχεια, η εντολή στην αριστερή πλευρά καθεμιάς από τις παρακάτω γραμμές θα παράγει την τιμή στη δεξιά πλευρά της γραμμής:
expr 3.1 + $a6.1
expr 2 + "$a.$b"5.6
expr 4*[μήκος "6 2"]8
expr {{ word one} < "word $a"}0
χειριστές
Οι έγκυροι τελεστές παρατίθενται παρακάτω, ομαδοποιημένοι με φθίνουσα σειρά προτεραιότητας:
- - + ~ !: Unary minus, unary plus, bit-wise NOT, λογικό NOT. Κανένας από αυτούς τους τελεστές δεν μπορεί να εφαρμοστεί σε τελεστές συμβολοσειρών και το NOT μπορεί να εφαρμοστεί μόνο σε ακέραιους αριθμούς.
- * / %: Πολλαπλασιασμός, διαίρεση, υπόλοιπο. Κανένας από αυτούς τους τελεστές δεν μπορεί να εφαρμοστεί σε τελεστές συμβολοσειρών και το υπόλοιπο μπορεί να εφαρμοστεί μόνο σε ακέραιους αριθμούς. Το υπόλοιπο θα έχει πάντα το ίδιο πρόσημο με τον διαιρέτη και απόλυτη τιμή μικρότερη από τον διαιρέτη.
- + -: Προσθέστε και αφαιρέστε. Ισχύει για οποιουσδήποτε αριθμητικούς τελεστές.
- << >>: Μετατόπιση αριστερά και δεξιά. Ισχύει μόνο για ακέραιους τελεστές. Μια μετατόπιση προς τα δεξιά διαδίδει πάντα το bit πρόσημου.
- < > <= >=: Boolean μικρότερο, μεγαλύτερο, μικρότερο ή ίσο και μεγαλύτερο από ή ίσο. Κάθε τελεστής παράγει 1 εάν η συνθήκη είναι αληθής, 0 διαφορετικά. Αυτοί οι τελεστές μπορούν να εφαρμοστούν σε συμβολοσειρές καθώς και σε αριθμητικούς τελεστές, οπότε χρησιμοποιείται σύγκριση συμβολοσειρών.
- == !=: Boolean ίσο και όχι ίσο. Κάθε χειριστής παράγει ένα αποτέλεσμα μηδέν/ένα. Ισχύει για όλους τους τύπους τελεστών.
- &: Λίγο-σοφά ΚΑΙ. Ισχύει μόνο για ακέραιους τελεστές.
- ^: Bit-wise αποκλειστικό Ή. Ισχύει μόνο για ακέραιους τελεστές.
- |: bit-wise Ή. Ισχύει μόνο για ακέραιους τελεστές.
- &&: Λογικό ΚΑΙ. Παράγει ένα αποτέλεσμα 1 εάν και οι δύο τελεστές είναι μη μηδενικοί, 0 διαφορετικά. Ισχύει μόνο για τελεστές boolean και αριθμητικούς (ακέραιους ή κινητής υποδιαστολής).
- ||: Λογικό Ή. Παράγει αποτέλεσμα 0 εάν και οι δύο τελεστές είναι μηδέν, 1 διαφορετικά. Ισχύει μόνο για τελεστές boolean και αριθμητικούς (ακέραιους ή κινητής υποδιαστολής).
- Χ?y:z: Αν-τότε-αλλιώς, όπως στο C. Αν Χ αξιολογείται σε μη μηδενικό, τότε το αποτέλεσμα είναι η τιμή του y. Διαφορετικά, το αποτέλεσμα είναι η τιμή του z. ο Χ Ο τελεστής πρέπει να έχει αριθμητική τιμή.
Δείτε το εγχειρίδιο C για περισσότερες λεπτομέρειες σχετικά με τα αποτελέσματα που παράγονται από κάθε χειριστή. Ολα τα δυαδικούς τελεστές ομαδοποιήστε από αριστερά προς τα δεξιά στο ίδιο επίπεδο προτεραιότητας. Για παράδειγμα, η εντολή.
expr 4*2 < 7
επιστρέφει 0.
ο &&, ||, και ?: Οι τελεστές έχουν "τεμπέλης αξιολόγηση", όπως ακριβώς στο C, που σημαίνει ότι οι τελεστές δεν αξιολογούνται εάν δεν χρειάζονται για να καθοριστεί το αποτέλεσμα. Για παράδειγμα, στο εντολή
expr {$v? [α]: [β]}
μόνο ένα από [ένα] ή [σι] θα αξιολογηθεί πραγματικά, ανάλογα με την τιμή του $v. Σημειώστε, ωστόσο, ότι αυτό ισχύει μόνο εάν ολόκληρη η έκφραση περικλείεται σε αγκύλες. Διαφορετικά, ο αναλυτής Tcl θα αξιολογήσει και τα δύο [ένα] και [σι] πριν την επίκληση του expr εντολή.
Μαθηματικές συναρτήσεις
Το Tcl υποστηρίζει τις ακόλουθες μαθηματικές συναρτήσεις σε εκφράσεις:
- κοιλιακοί(αργ): Επιστρέφει την απόλυτη τιμή του αργ. Arg μπορεί να είναι είτε ακέραιος είτε κινητής υποδιαστολής και το αποτέλεσμα επιστρέφεται με την ίδια μορφή.
- acos(αργ): Εμφανίζει το συνημίτονο τόξου του αργ, στην περιοχή [0,pi] ακτίνια. Arg πρέπει να είναι στην περιοχή [-1,1].
- όπως λέμε(αργ): Επιστρέφει το ημίτονο τόξου του αργ, στην περιοχή [-pi/2,pi/2] ακτίνια. Arg πρέπει να είναι στην περιοχή [-1,1].
- ένα μαύρισμα(αργ): Εμφανίζει την εφαπτομένη του τόξου του αργ, στην περιοχή [-pi/2,pi/2] ακτίνια.
- atan2(x, y): Εμφανίζει την εφαπτομένη του τόξου του y/Χ, στην περιοχή [-pi, pi] ακτίνια. Χ και y δεν μπορεί και τα δύο να είναι 0.
- οροφή(αργ): Επιστρέφει τη μικρότερη ακέραια τιμή όχι μικρότερη από αργ.
- cos(αργ): Επιστρέφει το συνημίτονο του αργ, μετρημένο σε ακτίνια.
- cosh(αργ): Εμφανίζει το υπερβολικό συνημίτονο του αργ. Εάν το αποτέλεσμα προκαλεί υπερχείλιση, επιστρέφεται ένα σφάλμα.
- διπλό(αργ): Αν αργ είναι μια κυμαινόμενη τιμή, επιστρέφει αργ, διαφορετικά μετατρέπεται αργ σε κυμαινόμενη και επιστρέφει την τιμή μετατροπής.
- exp(αργ): Επιστρέφει την εκθετική του αργ, ορίζεται ως e**αργ. Εάν το αποτέλεσμα προκαλεί υπερχείλιση, επιστρέφεται ένα σφάλμα.
- πάτωμα(αργ): Επιστρέφει τη μεγαλύτερη ακέραια τιμή όχι μεγαλύτερη από αργ.
- fmod(x, y): Επιστρέφει το υπόλοιπο κινητής υποδιαστολής της διαίρεσης του Χ με y. Αν y είναι 0, επιστρέφεται ένα σφάλμα.
- υποτο (x, y): Υπολογίζει το μήκος της υποτείνουσας ενός ορθογώνιου τριγώνου (Χ*Χ+y*y).
- int(αργ): Αν αργ είναι μια ακέραια τιμή, επιστρέφει αργ, διαφορετικά μετατρέπεται αργ σε ακέραιο με περικοπή και επιστρέφει την τιμή που έχει μετατραπεί.
- κούτσουρο(αργ): Επιστρέφει τον φυσικό λογάριθμο του αργ. Arg πρέπει να είναι θετική τιμή.
- log10(αργ): Επιστρέφει τον λογάριθμο βάσης 10 του αργ. Arg πρέπει να είναι θετική τιμή.
- Pow(x, y): Υπολογίζει την τιμή του Χ ανυψώθηκε στην εξουσία y. Αν Χ είναι αρνητικό, y πρέπει να είναι ακέραια τιμή.
- άκρα(): Επιστρέφει έναν αριθμό κινητής υποδιαστολής από το μηδέν σε μόλις μικρότερο από ένα ή, με μαθηματικούς όρους, το εύρος [0,1). Ο σπόρος προέρχεται από το εσωτερικό ρολόι του μηχανήματος ή μπορεί να ρυθμιστεί χειροκίνητα με τη λειτουργία srand.
- γύρος(αργ): Αν αργ είναι μια ακέραια τιμή, επιστρέφει αργ, διαφορετικά μετατρέπεται αργ σε ακέραιο με στρογγυλοποίηση και επιστρέφει την τιμή που έχει μετατραπεί.
- αμαρτία(αργ): Επιστρέφει το ημίτονο του αργ, μετρημένο σε ακτίνια.
- sinh(αργ): Επιστρέφει το υπερβολικό ημίτονο του αργ. Εάν το αποτέλεσμα προκαλεί υπερχείλιση, επιστρέφεται ένα σφάλμα.
- sqrt(αργ): Επιστρέφει την τετραγωνική ρίζα του αργ. Arg πρέπει να είναι μη αρνητικό.
- srand(αργ): Ο αργ, που πρέπει να είναι ακέραιος, χρησιμοποιείται για την επαναφορά του σπόρου για τη γεννήτρια τυχαίων αριθμών. Επιστρέφει τον πρώτο τυχαίο αριθμό από αυτόν τον σπόρο. Κάθε διερμηνέας έχει τον δικό του σπόρο.
- ηλιοκαμένος(αργ): Επιστρέφει την εφαπτομένη του αργ, μετρημένο σε ακτίνια.
- tanh(αργ): Εμφανίζει την υπερβολική εφαπτομένη του αργ.
Εκτός από αυτές τις προκαθορισμένες λειτουργίες, οι εφαρμογές μπορούν να ορίσουν πρόσθετες λειτουργίες χρησιμοποιώντας 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 σπριντφ προσδιοριστής μορφής %ρε για ακέραιους αριθμούς και %σολ για τιμές κινητής υποδιαστολής. Για παράδειγμα, οι εντολές:
expr {"0x03" > "2"}
expr {"0y" < "0x12"}
επιστρέφουν και τα δύο 1. Η πρώτη σύγκριση γίνεται χρησιμοποιώντας σύγκριση ακεραίων και η δεύτερη με τη σύγκριση συμβολοσειρών αφού ο δεύτερος τελεστής μετατραπεί στη συμβολοσειρά 18. Λόγω της τάσης του Tcl να αντιμετωπίζει τις τιμές ως αριθμούς όποτε είναι δυνατόν, δεν είναι γενικά καλή ιδέα να χρησιμοποιείτε τελεστές όπως == όταν θέλετε πραγματικά σύγκριση συμβολοσειρών και οι τιμές των τελεστών μπορεί να είναι αυθαίρετες. είναι καλύτερα σε αυτές τις περιπτώσεις να χρησιμοποιήσετε το σειρά εντολή αντί.