Πώς να χρησιμοποιήσετε τις συνθήκες δοκιμής σε ένα σενάριο Bash
ο Linuxδοκιμή Η εντολή συγκρίνει ένα στοιχείο με ένα άλλο, αλλά χρησιμοποιείται πιο συχνά σε Σενάρια κελύφους BASH ως μέρος του δηλώσεις υπό όρους που ελέγχουν τη λογική και τη ροή του προγράμματος.
Ένα βασικό παράδειγμα

Δοκιμάστε αυτές τις εντολές στο ένα παράθυρο τερματικού.
test 1 -eq 2 && echo "ναι" || ηχώ "όχι"
Η παραπάνω εντολή αναλύεται ως εξής:
- δοκιμή: Η εντολή για την εκτέλεση σύγκρισης
- 1:Το πρώτο στοιχείο που πρόκειται να συγκρίνετε. Σε αυτό το παράδειγμα, είναι ο αριθμός 1 αλλά θα μπορούσε να είναι οποιοσδήποτε αριθμός ή μια συμβολοσειρά μέσα σε εισαγωγικά.
- -εξ: Η μέθοδος σύγκρισης. Σε αυτήν την περίπτωση, δοκιμάζετε εάν μια τιμή ισούται με μια άλλη.
- 2: Το στοιχείο με το οποίο συγκρίνετε το πρώτο στοιχείο. Σε αυτό το παράδειγμα, είναι ο αριθμός 2.
- &&: Μια συντόμευση Linux για την αλυσίδα εντολών μαζί, με τη σειρά. Η έξοδος από τις δοκιμαστικές αλυσίδες στις εντολές που ακολουθούν. Ένα διπλό σύμφωνο εκτελείται όταν η εντολή που προηγείται έχει κατάσταση εξόδου 0, κάτι που είναι ένας φανταχτερός τρόπος να πούμε ότι η εντολή δεν απέτυχε.
- αντηχώ "ναι":Η εντολή να εκτελεστεί εάν η σύγκριση πετύχει. Σε αυτή την περίπτωση, το μόνο που κάνουμε είναι να ρωτήσουμε το ηχώ εντολή για την εκτύπωση της λέξης "ναι" στην τυπική έξοδο, αλλά θα μπορούσατε να εκτελέσετε οποιαδήποτε εντολή εδώ που θα εκτελούνταν εάν το αποτέλεσμα της δοκιμής αποδεικνυόταν αληθές.
- ||: Το αντίθετο, κατά κάποιο τρόπο, του &&; το double-pipe εκτελείται μόνο εάν η εντολή που προηγείται αποτύχει (έχει κατάσταση εξόδου που δεν είναι 0).
- ηχώ "όχι": Η εντολή να εκτελεστεί εάν η σύγκριση αποτύχει.
Εκτέλεση από μια προτροπή κελύφους, δοκιμή δεν επιστρέφει μια τιμή στην τυπική έξοδο, επιστρέφει απλώς έναν κωδικό κατάστασης εξόδου. Γι' αυτό είναι απαραίτητο να δεσμεύσετε μια εντολή echo.

Ουσιαστικά, η εντολή συγκρίνει το 1 με το 2 και αν ταιριάζουν, εκτελείται η δήλωση echo "ναι" που εμφανίζει "ναι" και αν δεν ταιριάζουν, εκτελείται η εντολή "όχι" ηχώ η οποία εμφανίζει "όχι."
Σύγκριση αριθμών
Εάν συγκρίνετε στοιχεία που αναλύονται ως αριθμοί, μπορείτε να χρησιμοποιήσετε τους ακόλουθους τελεστές σύγκρισης:
- -εξ: η τιμή 1 ισούται με την τιμή 2
- -ge: τιμή 1 μεγαλύτερη ή ίση με την τιμή 2
- -gt: τιμή 1 μεγαλύτερη από την τιμή 2
- -le: τιμή 1 μικρότερη ή ίση με την τιμή 2
- - λ: τιμή 1 μικρότερη από την τιμή 2
- -νε: η τιμή 1 δεν ισούται με την τιμή 2
Παραδείγματα δοκιμών
test 1 -eq 2 && echo "ναι" || ηχώ "όχι"
(εμφανίζει "όχι" στην οθόνη γιατί το 1 δεν ισούται με 2)
test 1 -ge 2 && echo "ναι" || ηχώ "όχι"
(εμφανίζει "όχι" στην οθόνη επειδή το 1 δεν είναι μεγαλύτερο ή ίσο με 2)
τεστ 1 -gt 2 && echo "ναι" || ηχώ "όχι"
(εμφανίζει "όχι" στην οθόνη επειδή το 1 δεν είναι μεγαλύτερο από 2)
test 1 -le 2 && echo "ναι" || ηχώ "όχι"
(εμφανίζει "ναι" στην οθόνη επειδή το 1 είναι μικρότερο ή ίσο με 2)
test 1 -lt 2 && echo "ναι" || ηχώ "όχι"
(εμφανίζει "ναι" στην οθόνη επειδή το 1 είναι μικρότερο ή ίσο με 2)
test 1 -ne 2 && echo "ναι" || ηχώ "όχι"
(εμφανίζει "ναι" στην οθόνη γιατί το 1 δεν ισούται με 2)
Σύγκριση κειμένου
Όταν συγκρίνετε στοιχεία που αναλύονται ως συμβολοσειρές, χρησιμοποιήστε τους ακόλουθους τελεστές σύγκρισης:
- =: η συμβολοσειρά 1 ταιριάζει με τη συμβολοσειρά 2
- !=: Η συμβολοσειρά 1 δεν ταιριάζει με τη συμβολοσειρά 2
- -n: το μήκος της συμβολοσειράς είναι μεγαλύτερο από 0
- -z: το μήκος της συμβολοσειράς ισούται με 0
Παραδείγματα
test "string1" = "string2" && echo "ναι" || ηχώ "όχι"
(εμφανίζει το "όχι" στην οθόνη επειδή το "string1" δεν ισούται με το "string2")
δοκιμή "string1" != "string2" && echo "ναι" || ηχώ "όχι"
(εμφανίζει "ναι" στην οθόνη επειδή το "string1" δεν ισούται με το "string2")
test -n "string1" && echo "yes" || ηχώ "όχι"
(εμφανίζει "ναι" στην οθόνη επειδή το "string1" έχει μήκος συμβολοσειράς μεγαλύτερο από μηδέν)
test -z "string1" && echo "yes" || ηχώ "όχι"
(εμφανίζει "όχι" στην οθόνη επειδή το "string1" έχει μήκος συμβολοσειράς μεγαλύτερο από μηδέν)
Σύγκριση αρχείων
Όταν συγκρίνετε αρχεία, χρησιμοποιήστε τους ακόλουθους τελεστές σύγκρισης:
- -εφ: Τα αρχεία έχουν τον ίδιο αριθμό συσκευής και inode (είναι το ίδιο αρχείο)
- -nt: Το πρώτο αρχείο είναι νεότερο από το δεύτερο αρχείο
- -ot: Το πρώτο αρχείο είναι παλαιότερο από το δεύτερο αρχείο
- -σι: Το αρχείο υπάρχει και είναι ειδικό μπλοκ
- -ντο: Το αρχείο υπάρχει και είναι ιδιαίτερο χαρακτήρα
- -ρε: Το αρχείο υπάρχει και είναι κατάλογος
- -μι: Το αρχείο υπάρχει
- -φά: Το αρχείο υπάρχει και είναι κανονικό αρχείο
- -σολ: Το αρχείο υπάρχει και έχει τον καθορισμένο αριθμό ομάδας
- -ΣΟΛ: Το αρχείο υπάρχει και κάτοχος από την ομάδα του χρήστη
- -η ή -ΜΕΓΑΛΟ: Το αρχείο υπάρχει και είναι α συμβολικός σύνδεσμος
- -κ: Το αρχείο υπάρχει και έχει οριστεί το sticky bit του
- -Ο: Το αρχείο υπάρχει, είστε ο κάτοχος
- -Π: Το αρχείο υπάρχει και είναι ένας σωλήνας με όνομα
- -r: Το αρχείο υπάρχει και είναι αναγνώσιμο
- -μικρό: Το αρχείο υπάρχει και έχει μέγεθος μεγαλύτερο από το μηδέν
- -ΜΙΚΡΟ: Το αρχείο υπάρχει και είναι α πρίζα
- -τ: Ο περιγραφέας αρχείου ανοίγει στο α τερματικό
- -u: Το αρχείο υπάρχει και έχει οριστεί το bit set-user-id
- -w: Το αρχείο υπάρχει και είναι εγγράψιμο
- -Χ: Το αρχείο υπάρχει και είναι εκτελέσιμο
Παραδείγματα
test /path/to/file1 -nt /path/to/file2 && echo "yes"
(Εάν το αρχείο1 είναι νεότερο από το αρχείο2, τότε θα εμφανιστεί η λέξη "ναι")
test -e /path/to/file1 && echo "ναι"
(εάν υπάρχει το αρχείο 1 θα εμφανιστεί η λέξη "ναι")
δοκιμή -O /path/to/file1 && echo "ναι"
(εάν είστε κάτοχος του αρχείου1 τότε εμφανίζεται η λέξη "ναι")
Ειδικό μπλοκ: Το αρχείο είναι μια συσκευή μπλοκ που σημαίνει ότι τα δεδομένα διαβάζονται σε μπλοκ byte. Αυτά είναι γενικά αρχεία συσκευών, όπως σκληροί δίσκοι.
Ιδιαίτερος χαρακτήρας: Το αρχείο πραγματοποιείται αμέσως όταν γράφετε σε αυτό και είναι συνήθως μια συσκευή όπως μια σειριακή θύρα
Σύγκριση πολλαπλών συνθηκών
Μέχρι στιγμής, όλα συγκρίνουν ένα πράγμα με ένα άλλο, αλλά τι γίνεται αν θέλετε να συγκρίνετε δύο συνθήκες;
Για παράδειγμα, εάν ένα ζώο έχει τέσσερα πόδια και κάνει "μουγκ", πιθανότατα είναι αγελάδα. Ο απλός έλεγχος για τέσσερα πόδια δεν εγγυάται ότι έχετε αγελάδα, αλλά ελέγχοντας τον ήχο που βγάζει σίγουρα το κάνει.
Για να ελέγξετε και τις δύο συνθήκες ταυτόχρονα, χρησιμοποιήστε την ακόλουθη πρόταση:
test 4 -eq 4 -a "moo" = "moo" && echo "είναι αγελάδα" || ηχώ "δεν είναι αγελάδα"
Το βασικό μέρος εδώ είναι το -ένα σημαία, που σημαίνει και.
Υπάρχει ένας καλύτερος και πιο συχνά χρησιμοποιούμενος τρόπος για την εκτέλεση του ίδιου τεστ και αυτός είναι ο εξής:
test 4 -eq 4 && test "moo" = "moo" && echo "είναι αγελάδα" || ηχώ "δεν είναι αγελάδα"
Ακολουθήστε τα κλαδιά!
Η διακλάδωση του δοκιμή η εντολή είναι σημαντική. Εάν η πρώτη δοκιμή (4 = 4) αποτύχει, το δοκιμή η εντολή τερματίζεται με έναν μη μηδενικό κωδικό εξόδου. Έτσι, μεταβαίνουμε στο σύμβολο διπλού σωλήνα και εκτυπώνεται το "δεν είναι αγελάδα" σε τυπική έξοδο. Ωστόσο, αν το πρώτο τεστ πετύχει και έτσι δοκιμή οδηγεί σε κωδικό εξόδου του 0, μετά μεταβαίνουμε στο πρώτο διπλό σύμφωνο. Αυτή η επόμενη δήλωση είναι μια άλλη προϋπόθεση δοκιμής!
Εάν η δεύτερη δοκιμή αποτύχει, πάλι, πηδάμε στον διπλό σωλήνα και προχωράμε από εκεί. Εάν, ωστόσο, το δεύτερο τεστ πετύχει, μεταβαίνουμε στη δεύτερη πρόταση διπλού συμπερασμάτων, η οποία είναι αυτό το παράδειγμα απλώς απηχεί το "είναι αγελάδα" στην τυπική απόδοση και στη συνέχεια καταλήγει πίσω στο κέλυφος προτροπή.
Ένα άλλο τεστ συγκρίνει δύο εντολές και αν είναι αληθές, βγάζει μια συμβολοσειρά. Για παράδειγμα, για να ελέγξετε ότι υπάρχει ένα αρχείο με το όνομα "file1.txt" ή ότι υπάρχει ένα αρχείο που ονομάζεται "file1.doc", μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή:
test -e file1.txt -o -e file1.doc && echo "το αρχείο1 υπάρχει" || echo "Το αρχείο1 δεν υπάρχει"
Το βασικό μέρος εδώ είναι το -ο που αντιπροσωπεύει ή.
Υπάρχει ένας καλύτερος και πιο συχνά χρησιμοποιούμενος τρόπος για την εκτέλεση του ίδιου τεστ και αυτός είναι ο εξής:
test -e file1.txt || test -e file1.doc && echo "το αρχείο1 υπάρχει" || echo "Το αρχείο1 δεν υπάρχει"
Εξάλειψη της λέξης-κλειδιού δοκιμής
Στην πραγματικότητα δεν χρειάζεται να χρησιμοποιήσετε τη λέξη δοκιμή για να γίνει η σύγκριση. Το μόνο που έχετε να κάνετε είναι να εσωκλείσετε τη δήλωση σε αγκύλες ως εξής:
[ -e file1.txt ] && echo "το αρχείο1 υπάρχει" || echo "Το αρχείο1 δεν υπάρχει"
ο [ και ] ουσιαστικά σημαίνει το ίδιο με δοκιμή.
Τώρα ξέρετε ότι μπορείτε να βελτιώσετε τη σύγκριση πολλαπλών συνθηκών ως εξής:
[ 4 -eq 4 ] && [ "moo" = "moo" ] && echo "είναι αγελάδα" || ηχώ "δεν είναι αγελάδα"
[ -e file1.txt ] || [ -e file1.doc ] && echo "το αρχείο1 υπάρχει" || echo "Το αρχείο1 δεν υπάρχει"
Περίληψη
Η εντολή δοκιμής είναι πιο χρήσιμη σε σενάρια, επειδή μπορείτε να ελέγξετε την τιμή μιας μεταβλητής έναντι μιας άλλης και να ελέγξετε τη ροή του προγράμματος. Στη γραμμή εντολών, χρησιμοποιήστε το για να ελέγξετε αν υπάρχει αρχείο ή όχι.