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

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

Αυτές οι λειτουργίες σάς επιτρέπουν να προσδιορίσετε εάν οι συγκριτικές συμβολοσειρές είναι ίδιες:

  • = - ίσος, για παράδειγμα if [ "$x" = "$y" ]
  • == - συνώνυμο του τελεστή "=", για παράδειγμα if [ "$x" == "$y" ]
  • != - όχι το ίδιο, για παράδειγμα if [ "$x" != "$y" ]

#!/bin/bash
testuser=anton
εάν [ $USER = $testuser ]
έπειτα
echo "Welcome $testuser"
fi

Το αποτέλεσμα του σεναρίου:

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

Μερικά χαρακτηριστικά της αντιστοίχισης συμβολοσειρών με μοτίβα:

Το # επιστρέφει true αν η συμβολοσειρά που περιέχεται στο $x ξεκινά με "y"
[[ $x == y* ]]
Το # επιστρέφει true αν η συμβολοσειρά του $x είναι ακριβώς δύο χαρακτήρες "y*"
[[ $x == "y*" ]]
Το # επιστρέφει true εάν το $x περιέχει το όνομα ενός αρχείου που περιέχεται στον τρέχοντα κατάλογο που ξεκινά με "y"
[ $x == y* ]
Το # επιστρέφει true αν η συμβολοσειρά $x είναι ίση με δύο χαρακτήρες "y*"
[ "$x" == "y*" ]

Για παράδειγμα, ελέγχοντας μια συμβολοσειρά bash για να δείτε αν ξεκινά με y:

#!/bin/bash
x=yandex
[[ $x == y* ]]
ηχώ $;

Αποτέλεσμα εκτέλεσης κώδικα:

Το σενάριο βγάζει 0 (μηδέν) επειδή ζητήσαμε τον κωδικό σφάλματος της τελευταίας εντολής που εκτελέστηκε. Ο κωδικός 0 σημαίνει ότι το σενάριο έτρεξε χωρίς σφάλματα. Πράγματι, η μεταβλητή $xπεριέχει τη συμβολοσειρά yandex, που ξεκινά με τον χαρακτήρα «y». Διαφορετικά, μπορεί να γραφτεί "1". Αυτός είναι ένας πολύ εύχρηστος τρόπος εντοπισμού σφαλμάτων σε σενάρια.

Σύγκριση χορδών αλφαβητικά στο Bash

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

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

#!/bin/bash
# εσφαλμένη χρήση τελεστών σύγκρισης συμβολοσειρών
val1=μπέιζμπολ
val2=χόκεϊ
εάν [ $val1 > $val2 ]
έπειτα

αλλού

fi

Τι συμβαίνει αν συγκρίνετε συμβολοσειρές bash:

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

Για να διορθώσετε αυτό το σφάλμα, πρέπει να διαφύγετε από τον χαρακτήρα ">", ώστε η συνθήκη να μοιάζει με αυτό:

...
εάν [ $val1 \> $val2 ]
...

Τότε το αποτέλεσμα του προγράμματος θα είναι σωστό:

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

#!/bin/bash
val1=Δοκιμή
val2=δοκιμή
εάν [ $val1 \> $val2 ]
έπειτα
echo "$val1 είναι μεγαλύτερο από $val2"
αλλού
echo "$val1 είναι μικρότερο από $val2"
fi

Το αποτέλεσμα του κώδικα:

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

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

Έλεγχος συμβολοσειράς για κενή τιμή

Σύγκριση με χρήση τελεστών -zκαι -nχρησιμοποιείται για να προσδιορίσει εάν μια μεταβλητή περιέχει περιεχόμενο. Με αυτόν τον τρόπο μπορείτε να βρείτε κενές γραμμές στο bash. Παράδειγμα:

#!/bin/bash
val1=δοκιμή
val2=""
Το # ελέγχει εάν η συμβολοσειρά είναι κενή
αν [ -n $val1 ]
έπειτα
echo "Η συμβολοσειρά "$val1" δεν είναι κενή"
αλλού
echo "Η συμβολοσειρά "$val1" είναι κενή"
fi
Το # ελέγχει εάν η συμβολοσειρά είναι κενή
αν [ -z $val2 ]
έπειτα
echo "Η συμβολοσειρά "$val2" είναι κενή"
αλλού
echo "Η συμβολοσειρά "$val2" δεν είναι κενή"
fi
αν [ -z $val3 ]
έπειτα
echo "Η συμβολοσειρά "$val3" είναι κενή"
αλλού
echo "Η συμβολοσειρά "$val3" δεν είναι κενή"
fi

Το αποτέλεσμα του κώδικα:

Αυτό το παράδειγμα δημιουργεί δύο μεταβλητές συμβολοσειράς - val1και val2. Λειτουργία -nκαθορίζει εάν μια μεταβλητή έχει val1μη μηδενικό μήκος και -zεπιταγές val2και val3στο μηδέν. Αξιοσημείωτο είναι ότι το τελευταίο δεν είχε οριστεί μέχρι τη στιγμή της σύγκρισης, αλλά ο διερμηνέας θεωρεί ότι το μήκος του εξακολουθεί να είναι ίσο με μηδέν. Αυτή η απόχρωση πρέπει να λαμβάνεται υπόψη σε διάφορους ελέγχους σεναρίων. Και, εάν δεν είστε βέβαιοι ποια τιμή περιέχεται στη μεταβλητή και αν έχει οριστεί καθόλου, θα πρέπει να την ελέγξετε χρησιμοποιώντας τον τελεστή -nή -zκαι μόνο τότε χρησιμοποιήστε το για τον προορισμό του.

Αξίζει να δώσετε προσοχή στη λειτουργία -n. Εάν μια μη δηλωμένη ή κενή μεταβλητή μεταβιβαστεί σε αυτήν για δοκιμή, θα επιστρέψει true, όχι false. Για τέτοιες περιπτώσεις, θα πρέπει να περικλείσετε τη συμβολοσειρά (μεταβλητή) που ελέγχεται σε διπλά εισαγωγικά, έτσι ώστε να μοιάζει με αυτό:

...
if [ -n "$val1" ]
...

συμπεράσματα

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

Η συνθήκη if-else εφαρμόζεται στα σενάρια BASHΣυχνά. Η ίδια η συνθήκη έχει μια κάπως περίεργη μορφή [[ συνθήκη ]]. Προσοχή στις εσοχές. Χωρίς αυτούς, η κατάσταση δεν θα λειτουργήσει. Δίνω μια λίστα με λογικούς τελεστές για την συνθήκη [[ ? ]]:

Λίστα λογικών τελεστών που
χρησιμοποιείται για την κατασκευή if-then-else-fi

#!/bin/bash αν [[ $1 > 2 ]] τότε # εάν [[ ? ]] echo $1" μεγαλύτερη από 2" other # αν όχι true echo $1" μικρότερη από 2 ή 2" fi

Μερικοί από εσάς θα βρείτε περίεργο τον τελεστή ισότητας -eq. Δοκιμάστε να χρησιμοποιήσετε γνωστούς τελεστές >

Ας υποθέσουμε ότι έχετε ένα σενάριο και απαιτείται επαλήθευση χρήστη. Εάν ο χρήστης δεν είναι root, τότε το σενάριο θα σταματήσει.

#!/bin/bash if [ "$(whoami)" != "root" ]; και μετά επαναλάβετε "Δεν έχετε άδεια να εκτελέσετε $0." έξοδος1; fi

Συχνά χρειάζεται να ελέγξετε μια μεταβλητή για μια τιμή. Εάν δεν υπάρχει τίποτα στη μεταβλητή, τότε μπορείτε να σταματήσετε το σενάριο.

#!/bin/bash if [ -n "$num" ]; τότε "η μεταβλητή έχει κάτι και μπορείτε να ξεκινήσετε μια άλλη διαδικασία" αλλιώς ηχώ "άδεια μεταβλητή, σταματήστε το σενάριο" έξοδος 0. fi

Εάν η μεταβλητή είναι κενή, τότε μπορεί να συμπληρωθεί.

#!/bin/bash if [ -z "$num" ]; τότε ηχώ "η μεταβλητή είναι κενή" num=1 else echo "num="$num fi

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

#!/bin/bash # Γράψτε ΠΡΟΕΠΙΛΟΓΗ εάν δεν υπάρχουν ορίσματα γραμμής εντολών [ -z "$arg1" ] && arg1=ΠΡΟΕΠΙΛΟΓΗ echo $arg1

Στα σενάρια κελύφους Bash, μπορούμε να κάνουμε συγκρίσεις αριθμών. Για να εκτελέσετε μια λειτουργία σύγκρισης αριθμών στο Bash, πρέπει να χρησιμοποιήσετε την κατάσταση "δοκιμής" εντός ενός βρόχου if ή. Σε αυτήν την ανάρτηση, θα σας πούμε πώς να συγκρίνετε αριθμούς στο bash.

Τελεστές για σύγκριση αριθμών bash

χειριστήςτι κάνειπαράδειγμα
-εξσυγκρίνετε ψηφία στο bash για ισότητα, επιστρέφει 0 εάν είναι ίσοαν [ $a -eq $b ] τότε
-geσυγκρίνοντας αριθμούς σε bash εάν είναι μεγαλύτεροι ή ίσοι. Το αποτέλεσμα επιστρέφει 0 εάν είναι μεγαλύτερο ή ίσο μεαν [ $a -ge $b ] τότε
-gtσυγκρίνει αριθμούς σε bash εάν είναι μεγαλύτεροι από.αν [ $a -gt $b ] τότε
-leσυγκρίνει αριθμούς σε bash εάν είναι μικρότεροι ή ίσοι.αν [ $a -le $b ] τότε
- λσυγκρίνει αριθμούς σε bash αν είναι μικρότεροι.αν [ $a -lt $b ] τότε
-νεσυγκρίνει αριθμούς σε bash αν δεν είναι ίσοι ή όχι.αν [ $a -ne $b ] τότε

Αναλυτικά παραδείγματα τελεστών σύγκρισης αριθμών στο Bash:

1. χειριστής-εξ

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

# cat test.sh #!/bin/bash echo "enter variable value" read a echo "enter variable value" read b if [ $a -eq $b ] και μετά echo "Return value:: $?" echo "a και b είναι ίσα" αλλιώς echo "Επιστρεφόμενη τιμή::$?" ηχώ "α και β δεν είναι ίσα" fi #

Εκτέλεση:

# sh test.sh εισάγετε τιμή μεταβλητής 2 εισάγετε τιμή μεταβλητής 3 Επιστρεφόμενη τιμή:: 1 a και b δεν είναι ίσα # sh test.sh εισάγετε τιμή μεταβλητής 2 εισάγετε τιμή μεταβλητής 2 Επιστρεφόμενη τιμή:: 0 a και b είναι ίσα #

Στο παραπάνω παράδειγμα, πήραμε τους αριθμούς 2 και 3 για πρώτη φορά και το σύστημα επέστρεψε την τιμή 1, ωστόσο, όταν πήραμε τις ίδιες τιμές για το a και το b, η μεταβλητή επιστρέφει μηδέν.

2. χειριστής-ge

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

# cat test1.sh #!/bin/bash #diff πρόγραμμα για -ge echo "enter value for variable" read a echo "enter value for variable b" read a b if [ $a -ge $b ] και στη συνέχεια echo "return value : :$?" echo "το a είναι μεγαλύτερο ή ίσο με το b" αλλιώς echo "return value::$?" ηχώ "το a δεν είναι μεγαλύτερο ή ίσο του b" fi #

3. χειριστής -gt

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

# cat test2.sh #!/bin/bash #differ for -gt b=100 echo "Εισαγάγετε μια τιμή μεγαλύτερη από 100" διαβάστε a εάν [ $a -gt $b ] και μετά ηχώ "Πολύ καλό" αλλιώς ηχώ "Όχι πολύ καλό "fi

4. χειριστής-le

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

#diff πρόγραμμα για -le b=5 echo "εισαγάγετε μια τιμή μικρότερη ή ίση με 5" διαβάστε a if [ $a -le $b ] και μετά ηχώ "σωστό" αλλιώς echo "false" fi #

5. χειριστής- λ

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

Η σύγκριση συμβολοσειρών στο Bash δεν προκαλεί προβλήματα μέχρι να προκύψει η εργασία να συγκρίνετε δύο συμβολοσειρές χωρίς διάκριση πεζών-κεφαλαίων. Θα δώσω αρκετές επιλογές για την επίλυση του προβλήματος που χρησιμοποιώ ο ίδιος. Ένα χαρακτηριστικό αυτών των λύσεων είναι η χρήση μόνο των ενσωματωμένων δυνατοτήτων του κελύφους Bash.

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

#!/bin/bash str1 = "String To Compare" str2 = "string για σύγκριση"

Η πρώτη έκδοση της σύγκρισης συμβολοσειρών χωρίς διάκριση πεζών-κεφαλαίων που θέλω να προτείνω χρησιμοποιεί τον έλεγχο των επιλογών φλοιού με την ενσωματωμένη εντολή shopt.

shopt -s nocasematch [[ $str1 == $str2 ]] && echo "match" || ηχώ «δεν ταιριάζει» shopt -u nocasematch

Η επόμενη έκδοση της σύγκρισης χορδών χωρίς διάκριση πεζών-κεφαλαίων βασίζεται στην αρχή της αυτο-χύτευσης χορδών σε μια κοινή θήκη. Αυτή η παραλλαγή κώδικα λειτουργεί στην έκδοση Bash 4 και νεότερη. Η χρήση του σε παλαιότερη έκδοση του Bash θα οδηγήσει σε σφάλμα.

Έτσι, για να συγκρίνετε τις συμβολοσειρές που εκπέμπονται με πεζά, μπορείτε να χρησιμοποιήσετε τον ακόλουθο κώδικα.

[[ " $( str1 , ) " == " $( str2 , ) " ]] && echo "match" || ηχώ "δεν ταιριάζει"

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

[[ " $( str1 ^^ ) " == " $( str2 ^^ ) " ]] && echo "match" || ηχώ "δεν ταιριάζει"

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

Για να δηλώσετε μια μεταβλητή που περιέχει πεζό κείμενο, χρησιμοποιήστε τον ακόλουθο κώδικα.

#!/bin/bash declare -l str = "Camel Case String"

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

#!/bin/bash str = "Camel Case String" declare -l str str = $str echo $str

Για να μετατρέψετε μια συμβολοσειρά σε κεφαλαία, στο παραπάνω παράδειγμα κώδικα, θα πρέπει να αλλάξετε την κλήση στην εντολή δήλωση, χρησιμοποιώντας το διακόπτη -u αντί για το διακόπτη -l.

Τώρα μια σύγκριση συμβολοσειρών χωρίς διάκριση πεζών-κεφαλαίων χρησιμοποιώντας την εντολή declare μπορεί να γίνει ως εξής.

δήλωση -l str1_l = $str1 δήλωση -l str2_l = $str2 [[ $str1_l == $str2_l ]] && echo "match" || ηχώ "δεν ταιριάζει"

Οποιαδήποτε από αυτές τις συγκρίσεις συμβολοσειρών χωρίς διάκριση πεζών-κεφαλαίων μπορεί να χρησιμοποιηθεί στη δέσμη ενεργειών Bash. Επομένως, εάν χρησιμοποιείτε την έκδοση Bash 4 και νεότερη, μπορείτε να επιλέξετε αυτή που σας αρέσει περισσότερο. Εάν η έκδοση Bash είναι μικρότερη από 4, τότε θα πρέπει να χρησιμοποιηθεί η πρώτη επιλογή, προσδιορίζοντας την επιλογή nocasematch χρησιμοποιώντας το ενσωματωμένο κέλυφος shopt.

Αυτό το θέμα είναι το τέταρτο θέμα στη σειρά γλωσσών bash shell. Θα μιλήσει για τέτοιες δομές ελέγχου της γλώσσας όπως δηλώσεις υπό όρους. Αλλά πριν προχωρήσουμε στην περιγραφή τους, είναι απαραίτητο να σταθούμε σε ορισμένες αποχρώσεις που θα κάνουν την εξέταση του υλικού παρακάτω πιο κατανοητή.
Αρχικά, ας δούμε τι είναι μια λίστα εντολών. Μια λίστα εντολών είναι μια μεμονωμένη εντολή, μια διοχέτευση ή μια ακολουθία εντολών/σωλήνων που χωρίζονται από έναν από τους ακόλουθους τελεστές: ";", "&&", "||", που τερματίζεται με ένα ερωτηματικό.
; - χειριστής διαδοχικής εκτέλεσης πολλών εντολών. Κάθε επόμενη εντολή ξεκινά να εκτελείται μόνο μετά την ολοκλήρωση της προηγούμενης (είτε επιτυχής είτε όχι).
&& - τελεστής εκτέλεσης εντολών μόνο μετά την επιτυχή εκτέλεση του προηγούμενου.
|| - δήλωση για την εκτέλεση μιας εντολής μόνο μετά από λανθασμένη εκτέλεση της προηγούμενης.
Ο κωδικός επιτυχίας είναι 0 και ο κωδικός σφάλματος δεν είναι μηδέν (ανάλογα με τον τύπο του σφάλματος). Δεν πρέπει να συγχέεται με τις κοινές γλώσσες προγραμματισμού όταν το 1 είναι αληθές και το 0 είναι λάθος.
Τώρα μπορούμε να προχωρήσουμε στην άμεση εξέταση των δηλώσεων υπό όρους.

τελεστής παραλλαγής θήκης

Η γενική σύνταξη της δήλωσης υπόθεσης είναι:

αξία υπόθεσης σε
template1) list1;;
μοτίβο2 | template3) list2;;
esac

Η λογική ακολουθία εκτέλεσης της δήλωσης υπόθεσης:
α) αναζητείται το πρώτο μοτίβο που ταιριάζει με την τιμή.
β) εάν βρεθεί, εκτελείται η λίστα των εντολών που αντιστοιχούν σε αυτήν, που τερματίζεται με ";;";
γ) ο έλεγχος μεταβιβάζεται στους χειριστές μετά την κατασκευή της θήκης.
Το μοτίβο και η λίστα χωρίζονται με τον χαρακτήρα ")". Πολλές συνθήκες μπορούν να αντιστοιχούν σε μία λίστα εντολών, οπότε πρέπει να διαχωρίζονται με το σύμβολο "|".
Στα πρότυπα, μπορείτε να χρησιμοποιήσετε τους χαρακτήρες "*", "?", "", που περιγράφηκαν στο δεύτερο θέμα του κύκλου. Με τη βοήθειά τους, μπορείτε να εφαρμόσετε μια οδηγία που λειτουργεί ως προεπιλογή στη δήλωση διακόπτη γλωσσών όπως C, PHP.
Θα δώσω ένα παράδειγμα χρήσης περίπτωσης:
echo -n "[Universal Viewer] Καθορίστε το όνομα αρχείου: "; διαβάστε την περίπτωση αρχείου "$File" σε *.jpg|*.gif|*.png) eog $File ;; *.pdf) evince $File ;; *.txt) λιγότερο $File ;; *.html) firefox $File ;; /dev/*) echo "Λοιπόν, αυτά είναι τρομακτικά αρχεία." ;; *) echo "Εντάξει, εντάξει - όχι τόσο ευέλικτο." echo "Δεν είμαι εξοικειωμένος με αυτόν τον τύπο αρχείου. Δεν ξέρω πώς να το δω." ;; esac
Ένα άλλο παράδειγμα χρήσης της κατασκευής case:
echo "Σφάλμα. Σε ποιον να στείλω το μήνυμα;" ηχώ "Προς το αφεντικό: β" ηχώ "Προς συναδέλφους: γ" ηχώ "Σε κανέναν: οποιοδήποτε κλειδί" ανάγνωση απάντηση περίπτωση $απάντηση σε β|Β) mail –s "καταγραφή σφαλμάτων" αφεντικό< error.log;; c|C) mail –s "Help! error log" –c denis nick < error.log;; *) echo "error"; exit;; esac

Δήλωση εάν υπό όρους

Η γενική σύνταξη της εντολής if είναι:

αν λίστα1 τότε
λίστα 2

fi

Οι αγκύλες εδώ υποδεικνύουν προαιρετικές κατασκευές. Η λογική ακολουθία εκτέλεσης της δήλωσης υπόθεσης:
α) εκτελείται η λίστα 1.
β) εάν εκτελείται χωρίς σφάλματα, εκτελείται η λίστα2. Διαφορετικά, εκτελείται η λίστα 3 και αν ολοκληρωθεί χωρίς σφάλμα, η λίστα 4. Εάν η λίστα 3 επιστρέφει επίσης έναν κωδικό σφάλματος, η λίστα 5 εκτελείται.
γ) ο έλεγχος μεταβιβάζεται στους χειριστές μετά την κατασκευή if.
Θα δώσω ένα παράδειγμα χρήσης εάν:
εάν το αρχείο grep -q Bash τότε επαναλάβετε "Το αρχείο περιέχει τουλάχιστον μία λέξη Bash." fi
Όταν το if και το then βρίσκονται στην ίδια γραμμή, τότε οι κατασκευές if και then πρέπει να τελειώνουν με ερωτηματικό. Για παράδειγμα:
$αν[$? –ne0]; μετά ηχώ "Σφάλμα"? fi
Τώρα, γνωρίζοντας ότι είναι δυνατό να βάλουμε το if και τότε στην ίδια γραμμή, ας ξαναγράψουμε το παραπάνω παράδειγμα:
if grep -q αρχείο Bash? και μετά ηχώ "Το αρχείο περιέχει τη λέξη Bash." fi

δήλωση δοκιμής και εκφράσεις υπό όρους

Στο παραπάνω παράδειγμα, αντί για ανάλυση του κωδικού εξόδου, χρησιμοποιείται ένας έλεγχος συνθήκης. Οι δύο μορφές μιας τέτοιας δοκιμής είναι ισοδύναμες: η ενσωματωμένη εντολή δοκιμής και [συνθήκη]. Για παράδειγμα, για να ελέγξετε εάν υπάρχει ένα αρχείο, θα γράψετε:
τεστ -ε<файл>
ή
[-μι<файл> ]
Εάν χρησιμοποιούνται αγκύλες, πρέπει να διαχωρίζονται μεταξύ τους με ένα κενό, επειδή το "[" είναι το όνομα της εντολής και το "]" είναι το τελευταίο όρισμα που απαιτείται για τον τερματισμό της.
Εάν η συνθήκη ελεγχθεί επιτυχώς, επιστρέφεται το 0 και εάν είναι ψευδές, ο κωδικός σφάλματος είναι 1.
Η εντολή δοκιμής μπορεί να ελέγξει εάν μια συμβολοσειρά είναι κενή. Μια μη κενή συμβολοσειρά έχει ως αποτέλεσμα τον κωδικό εξόδου 0. Κενό, αντίστοιχα - 1. Για παράδειγμα:
$ δοκιμή $USER; ηχώ $; 0
Η κατασκευή "" είναι πιο ευέλικτη από το "". Αυτή η εκτεταμένη έκδοση της εντολής δοκιμής. Μέσα σε αυτήν την κατασκευή, δεν εκτελείται πρόσθετη ερμηνεία των ονομάτων αρχείων και δεν πραγματοποιείται διαχωρισμός ορισμάτων σε ξεχωριστές λέξεις, αλλά επιτρέπεται η αντικατάσταση παραμέτρων και εντολών. Για παράδειγμα:
file=/etc/passwd αν [[ -e $file ]] τότε επαναλάβετε το "Password file found." fi
Η κατασκευή "" είναι προτιμότερη από το "" γιατί θα βοηθήσει στην αποφυγή ορισμένων λογικών λαθών. Για παράδειγμα, οι τελεστές "&&", "||", "<" и ">Το " inside "" είναι απολύτως έγκυρο, ενώ το εσωτερικό "" δημιουργεί μηνύματα σφάλματος.
Η κατασκευή "(())" επιτρέπει τον υπολογισμό των αριθμητικών παραστάσεων μέσα σε αυτήν. Εάν το αποτέλεσμα του υπολογισμού είναι μηδέν, τότε επιστρέφεται ένας κωδικός σφάλματος. Ένα μη μηδενικό αποτέλεσμα του υπολογισμού δίνει έναν κωδικό επιστροφής 0. Δηλαδή, το ακριβώς αντίθετο από τη δοκιμή και τις οδηγίες "" που συζητήθηκαν παραπάνω.
Η δήλωση if επιτρέπει ένθετους ελέγχους:
if echo "Το επόμενο *if* είναι μέσα στο πρώτο *if*." αν [[ $comparison = "ακέραιος" ]] τότε ((α< b)) else [[ $a < $b ]] fi then echo "$a меньше $b" fi

Οι εκφράσεις υπό όρους μπορούν να συνδυαστούν χρησιμοποιώντας τις συνήθεις λογικές πράξεις:
! <выражение>- άρνηση
<выражение1>-ένα<выражение2>- λογικό ΚΑΙ?
<выражение1>–ο<выражение2>- λογικό Ή.

Στοιχειώδεις εκφράσεις υπό όρους για αρχεία:
-e - το αρχείο υπάρχει.
-f - κανονικό αρχείο (όχι αρχείο καταλόγου ή συσκευής).
-s - μη μηδενικό μέγεθος αρχείου.
-d - το αρχείο είναι ένας κατάλογος.
-b - το αρχείο είναι μια συσκευή μπλοκ (δισκέτα, cdrom, κ.λπ.).
-c - το αρχείο είναι μια συσκευή χαρακτήρων (πληκτρολόγιο, μόντεμ, κάρτα ήχου κ.λπ.).
-p - το αρχείο είναι σωλήνας.
-h - το αρχείο είναι ένας συμβολικός σύνδεσμος.
-L - το αρχείο είναι ένας συμβολικός σύνδεσμος.
-S - το αρχείο είναι υποδοχή.
-t - το αρχείο σχετίζεται με μια τερματική συσκευή.
-r - το αρχείο είναι αναγνώσιμο (στο χρήστη που ξεκίνησε το σενάριο).
-w - το αρχείο είναι εγγράψιμο (στο χρήστη που εκτέλεσε το σενάριο).
-x - το αρχείο είναι διαθέσιμο για εκτέλεση (στο χρήστη που ξεκίνησε το σενάριο).
-g - έχει οριστεί η σημαία (sgid) για αρχείο ή κατάλογο.
-u - (suid) έχει οριστεί η σημαία για το αρχείο.
-k - η σημαία κολλώδους bit έχει οριστεί.
-O - ​​είστε ο κάτοχος του αρχείου.
-G - ανήκετε στην ίδια ομάδα με το αρχείο.
-N - το αρχείο έχει τροποποιηθεί από την τελευταία ανάγνωση.
file1 -nt file2 – το αρχείο1 είναι νεότερο από το file2.
file1 -ot file2 – το file1 είναι παλαιότερο από το file2.
file1 -ef file2 - file1 και file2 είναι σκληροί σύνδεσμοι στο ίδιο αρχείο.

Στοιχειώδεις εκφράσεις υπό όρους για σύγκριση συμβολοσειρών:
-z συμβολοσειρά – το μήκος της συμβολοσειράς είναι 0.
-n συμβολοσειρά – το μήκος της συμβολοσειράς δεν είναι ίσο με 0.
string1 == string2 – οι συμβολοσειρές ταιριάζουν (παρόμοια με το "=");
line1 !== line2 – οι γραμμές δεν ταιριάζουν (παρόμοια με το "!=");
γραμμή 1< строка2 – строка1 предшествует строке2 в лексикографическом порядке;
line1 > line2 - line1 ακολουθεί τη γραμμή2 σε λεξικογραφική σειρά.
Μια αριθμητική έκφραση υπό όρους έχει τη μορφή:
όρισμα 1 πράξη όρισμα2 όπου τα ορίσματα είναι ακέραιοι και επιτρέπονται οι ακόλουθες πράξεις:
-eq - ίσο;
-ne - όχι ίσο.
-lt - λιγότερο;
-le - μικρότερο ή ίσο.
-gt - περισσότερα;
-ge - μεγαλύτερο ή ίσο.
< - меньше (внутри двойных круглых скобок);
<= - меньше или равно (внутри двойных круглых скобок);
> - μεγαλύτερο από (μέσα σε διπλή παρένθεση).
>= - μεγαλύτερο ή ίσο με (εντός διπλής παρένθεσης).

Ας ξαναγράψουμε το προηγούμενο παράδειγμα χρησιμοποιώντας μια πρόταση if:
echo "Σφάλμα. Σε ποιον να στείλω το μήνυμα;" ηχώ "Στο αφεντικό: β" ηχώ "Στους συναδέλφους: γ" ηχώ "Σε κανέναν: κανένα κλειδί" διαβάστε την απάντηση if [ "$answer" == "b" –o "$answer" == "B" ]; στη συνέχεια, mail –s "error log" boss< error.log; elif [ "$answer" == "c" –o "$answer" == "C" ]; then mail –s "Help! error log" –c denis nick < error.log; else echo "error"; exit; fi

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

UPD: Χάρη στον χρήστη