Bash: Συνθήκες (αν-τότε-αλλιώς)

Γεια σας

Αυτή τη φορά θα σας δείξω πώς να φτιάξετε ένα σενάριο με συνθήκη Bash, που μεταφράστηκε είναι:

Εάν το πράγμα X που θέλετε έχει ολοκληρωθεί, η ενέργεια Y γίνεται, εάν δεν επιτευχθεί τότε γίνεται άλλη ενέργεια.

Απλή εξήγηση όχι 😀

Τώρα, σκέφτηκα για μερικά λεπτά κάποιο παράδειγμα για χρήση σε αυτό το σεμινάριο, μου συνέβη το ακόλουθο δίλημμα / πρόβλημα / κατάσταση:

Είμαστε στο δίκτυο της εταιρείας μας και θέλουμε να μάθουμε αν ο υπολογιστής X είναι συνδεδεμένος στο δίκτυο. Για αυτό κάνουμε ένα γραφή τι θα κάνει ping σε προς αυτόν τον υπολογιστή, και εάν βρίσκεται σε δίκτυο (δηλαδή, εάν επιστρέφει το ping σε) θα μας πει ότι ΝΑΙ, είναι στο δίκτυο, αλλιώς (δηλαδή δεν είναι στο δίκτυο) θα μας πει ότι ΔΕΝ βρίσκεται στο δίκτυο.

Μόλις γίνει αυτό, τώρα θα εξηγήσω πώς να κάνω κύκλο με συνθήκες 🙂

Εδώ είναι ο κωδικός:

ping -c 1 DIRECCION-IP
if [ $? -ne 0 ]; then
echo "No está en red"
else
echo "Sí está en red"
fi

Μην ανησυχείτε, θα σας το εξηγήσω λεπτομερώς 😉

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

Όπως μπορείτε να δείτε, έβαλα «-γ 1«, Το οποίο είναι απαραίτητο για εμάς. Όταν κάνουμε ping σε έναν υπολογιστή, αυτή η ενέργεια δεν σταματά (ping) μέχρι να πατήσουμε τον εαυτό μας [Ctrl] + [C], βάζοντας έτσι «-γ 1»Σας λέμε να κάνετε μόνο μία επαλήθευση (μόνο μία προσπάθεια ping) και καμία άλλη, αυτό θα την σταματήσει αμέσως, δηλαδή… θα ελέγξει αν ο υπολογιστής βρίσκεται στο δίκτυο μόνο μία φορά.

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

Τώρα έρχεται ο κύκλος, γιατί αυτό που μόλις εξήγησα δεν είναι τίποτα άλλο από μια κανονική εντολή / ενέργεια 😀

if [ $? -ne 0 ]; then
echo "No está en red"
else
echo "Sí está en red"
fi

Για να το καταλάβετε αυτό, θα εξηγήσω μια εξαιρετικά σημαντική λεπτομέρεια του Bash 🙂

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

Αυτό συμβαίνει όπως στο Bash είναι κάτι σαν 0 y 1, δηλαδή, είτε είστε ζωντανός είτε είστε νεκροί, όταν εκτελείται μια εντολή ή μια ενέργεια: Είτε εκτελέστηκε καλά Κανένα πρόβλημα (1), Α υπήρχαν μερικά πρόβλημα ή σφάλμα (0).

Πραγματοποιούμε X ενέργεια ή εντολή, και αυτό που κάναμε μπορεί να έχει γίνει καλά ή άσχημα, μπορεί να είχε λάθος ή όχι και εδώ είναι η λεπτομέρεια 😉

Εάν αυτό που στέλνουμε να κάνουμε (σε αυτήν την περίπτωση: ping -c 1 IP-ΔΙΕΥΘΥΝΣΗ) δεν έδωσε σφάλμα και ήταν επιτυχές, επομένως θα επιστρέψει την τιμή: 1 . Διαφορετικά, και εάν η ενέργεια (δηλαδή το ping) δεν ήταν επιτυχής, θα επιστρέψει την τιμή 0.

 Και τέλος, τι σημαίνει ο παραπάνω κώδικας είναι αυτό:

Εάν η τιμή 0 επιστράφηκε τότε

Εμφάνιση του κειμένου: «Όχι στο δίκτυο»

Διαφορετικά (και επιστρέψτε ΟΧΙ 0, αλλά 1)

Εμφάνιση του κειμένου: «Εάν είναι στο δίκτυο«

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

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

Τώρα, ας φτιάξουμε το σενάριό μας 😀

Πρέπει να ακολουθήσουμε τα βήματα σε αυτό το σεμινάριο: Bash: Πώς να φτιάξετε ένα εκτελέσιμο σενάριο

Στη συνέχεια, ας αντιγράψουμε τον ακόλουθο κώδικα σε αυτό το αρχείο (σενάριο.sh), και στο τέλος ας πούμε «έξοδος»(Χωρίς τα εισαγωγικά):

ping -c 1 DIRECCION-IP
if [ $? -ne 0 ]; then
echo "No está en red"
else
echo "Sí está en red"
fi

Θα πρέπει να μοιάζει με αυτό (θυμηθείτε ότι πρέπει να έχετε αλλάξει το IP-ADDRESS σε IP που θέλετε):

Εδώ μπορείτε να δείτε το σενάριο που εκτελείται:

% ΚΩΔΙΚΟΣ1%

Όπως μπορείτε να δείτε, στο τέλος μας λέει «Ναι είναι στο δίκτυο»🙂

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

read "texto"
if [ "$texto" = "3" ]; then
echo "Correcto"
else
echo "Incorrecto"
fi

Αυτό σημαίνει ότι είναι απλό, αφήνω τη γραμμή εξήγησης ανά γραμμή:

1η γραμμή: Αυτό που γράφουμε, αυτή θα είναι η τιμή της μεταβλητής «κείμενο»(Χωρίς τα εισαγωγικά).

2η γραμμή: Ελέγξτε εάν το περιεχόμενο της μεταβλητής (αυτό που μόλις γράψαμε) είναι 3.

3η γραμμή: Σε περίπτωση ύπαρξης 3, θα μας δείξει το κείμενο «Διορθώστε»(Χωρίς τα εισαγωγικά).

4η γραμμή: Διαφορετικά (δηλαδή, σε περίπτωση που δεν έχουμε γράψει 3).

5η γραμμή: Θα μας δείξει το κείμενο «Ανακριβής»(Χωρίς τα εισαγωγικά).

6η γραμμή: Λήξη της κατάστασης.

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

echo "esto es una prueba"

Θα μας δείξει το κείμενο στο τερματικό: αυτό είναι ένα τεστ

Αλλά επιστρέφοντας σε αυτό το δεύτερο παράδειγμα, θα σας δείξω τη χρησιμότητα (και την εκτέλεση) αυτού του δεύτερου σεναρίου με κάτι ΠΟΛΥ απλό 😀… το τυπικό «πόσο είναι το 1 + 2;«

Αφήνω τον κωδικό του πλήρους σεναρίου:

#!/bin/bash
# -*- ENCODING: UTF-8 -*-
echo "¿Cuánto es 1 + 2?"
read "texto"
if [ "$texto" = "3" ]; then
echo "Correcto"
else
echo "Incorrecto"
fi
exit

Δείτε πώς λειτουργεί το σενάριο:

% ΚΩΔΙΚΟΣ2%

Και λοιπόν ... τίποτα άλλο να προσθέσω.

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

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

αφορά


Αφήστε το σχόλιό σας

Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα υποχρεωτικά πεδία σημειώνονται με *

*

*

  1. Υπεύθυνος για τα δεδομένα: Miguel Ángel Gatón
  2. Σκοπός των δεδομένων: Έλεγχος SPAM, διαχείριση σχολίων.
  3. Νομιμοποίηση: Η συγκατάθεσή σας
  4. Κοινοποίηση των δεδομένων: Τα δεδομένα δεν θα κοινοποιούνται σε τρίτους, εκτός από νομική υποχρέωση.
  5. Αποθήκευση δεδομένων: Βάση δεδομένων που φιλοξενείται από τα δίκτυα Occentus (ΕΕ)
  6. Δικαιώματα: Ανά πάσα στιγμή μπορείτε να περιορίσετε, να ανακτήσετε και να διαγράψετε τις πληροφορίες σας.

  1.   Ταλς dijo

    Είστε επαγγελματίας !!! *ή*

    1.    KZKG ^ Γκάρα dijo

      Όχι για τίποτα 😀
      Αν σας εξυπηρετούσε και είναι ενδιαφέρον, είμαι ικανοποιημένος 😉

      Χαιρετισμούς φίλε

  2.   κατάλληλος dijo

    @ KZKG ^ Gaara,
    μιλώντας για προγραμματισμό bash Έχω μια ερώτηση:
    Ποια είναι η διαφορά μεταξύ της δήλωσης μιας μεταβλητής όπως αυτή της VAR = γεια και της δήλωσης της ως αυτής της VAR = $ {VAR: -hello};

    Εξηγώ:
    http://pastebin.com/a3cfWXeD

    χαιρετισμούς 😉

    1.    KZKG ^ Γκάρα dijo

      Γεια σας
      Λοιπόν, δεν είμαι καθόλου ειδικός στο bash ... στην πραγματικότητα, δεν έχω ιδέα LOL !!
      Καθώς δηλώνω τις μεταβλητές είναι έτσι:
      : ${OPTFOLDER:="/opt/"}

      Αλλά επειδή το έκανα πάντα έτσι, δεν ξέρω ποια θα μπορούσε να είναι η διαφορά ειλικρινά 🙁

  3.   κατάλληλος dijo

    @ KZKG ^ Γκάρα
    Λοιπόν, έκανα την ερώτηση γιατί δεν ήξερα, γράφω συνήθως το SlackBuilds και η αλήθεια είναι ότι οι μεταβλητές δηλώνονται όπως στο VAR1 αφθονούν σε αυτά τα σενάρια. Μια γρήγορη αναζήτηση στο google με βοήθησε να διευκρινίσω αυτήν την ερώτηση, το μοιράζομαι με όλους, ώστε να μπορούμε όλοι να μάθουμε:

    script:
    http://pastebin.com/faAQb35w

    Εξήγηση:
    Η δήλωση μεταβλητών της φόρμας VAR = $ {VAR: -default_value} σημαίνει ότι η μεταβλητή VAR θα λάβει την τιμή default_value εάν και μόνο εάν η τιμή είναι μηδενική ή δεν υπάρχει.

    Πρακτικό παράδειγμα:
    κατά την εκτέλεση του σεναρίου, ζητά να εισαγάγετε μια τιμή που θα αποθηκευτεί στη μεταβλητή VAR, εάν εισαχθεί κάτι θα δείξει τι έχει εισαχθεί. Εάν δεν εισαγάγουμε τίποτα και πατήσουμε enter δηλώνουμε τη μεταβλητή VAR ως μηδενική, επομένως δείχνει value_default.

    Χαιρετισμούς.

    1.    KZKG ^ Γκάρα dijo

      ΧΑΧΑ δεν το ήξερα 😀
      Εντάξει, ευχαριστώ πολύ φίλε ... αυτό εννοούσα στο τέλος του άρθρου, δεν σκοπεύω να διδάξω κάτι και αυτό είναι, ξέρω ότι πάντα θα μαθαίνω κάτι νέο εδώ

      Χαιρετισμούς και ευχαριστώ για άλλη μια φορά.

      1.    κατάλληλος dijo

        έχετε δίκιο, κάποιος μαθαίνει πολλά πράγματα εδώ.

        χαιρετισμούς και καλές διακοπές !! 😀

  4.   Λούκας Ματιάς dijo

    Υπέροχα και άριστα εξήγησε το +1, ο χρόνος που θα σας πάρει ...
    αλλά αξίζει τον κόπο 😉

    1.    KZKG ^ Γκάρα dijo

      Στην πραγματικότητα έγραψα το 80% σε μόλις 1 ημέρα, μου πήρε τόσο πολύ καιρό για να το δημοσιεύσω μόνο και μόνο επειδή το Διαδίκτυο μου δεν με άφηνε.
      Ευχαριστώ για το σχόλιό σας 😉

  5.   Hugo dijo

    Ένας άλλος τρόπος για να το κάνετε είναι να χρησιμοποιήσετε το DNS, δεδομένου ότι μερικές φορές τα δίκτυα έχουν αποκλείσει το πρωτόκολλο ICMP:

    (host -ta IP-ADDRESS> / dev / null 2> & 1) && echo "Συνδεδεμένο στο δίκτυο"

    Θα παρατηρήσετε επίσης ότι σε αυτό το παράδειγμα ο έλεγχος τιμής επιστροφής είναι σιωπηρός 😉

    1.    KZKG ^ Γκάρα dijo

      Εσείς όπως πάντα φίλοι, με συμβουλές που δεν γνωρίζω εντελώς HAHAHA.
      Σας ευχαριστώ, το σχόλιο εκτιμάται και hehe ... ένα άλλο νέο πράγμα που μαθαίνω 😀

  6.   Ντατούξ dijo

    Ευχαριστίες

    ????

  7.   Λέπερ_ Ιβάν dijo

    Παρόλο που έχουν περάσει αρκετές ημέρες από τη δημοσίευση αυτού του θέματος, με έχει εξυπηρετήσει πολύ, τώρα που έκανα ένα σενάριο στο bash .. Ευχαριστώ Gaara ..

  8.   Έντγκαρ Ναβάρο dijo

    Έγγρ. Ευχαριστώ για τη βοήθεια που μου φάνηκε ξεκάθαρη.

    Απλώς ένα ερώτημα, πώς μπορώ να το κάνω έτσι ώστε όταν ένας υπολογιστής σταματήσει να ping αυτόματα ο άλλος αλλάζει IP. Εχω αυτό.

    για να αλλάξετε την IP
    #! / bin / bash
    ping -c 10 192.168.1.50 # εάν δεν πραγματοποιείται αυτόματα ping
    ifconfig eth0 192.168.1.50 netmask 255.255.255.0 μετάδοση 192.168.1.0
    ifconfig eth0 κάτω
    ifconfig eth0 πάνω

  9.   Αβραάμ dijo

    γιατί κατά τη σύγκριση με το αν χρησιμοποιείτε το ερωτηματικό; τι διαφορά υπάρχει μεταξύ της τοποθέτησης του; οποιοδήποτε άλλο γράμμα

    1.    KZKG ^ Γκάρα dijo

      $; σημαίνει «την προηγούμενη έξοδο ή έξοδο», δηλαδή, σε περίπτωση που το αποτέλεσμα της προηγούμενης εντολής ... 🙂

      1.    Ανδρέας dijo

        Υπάρχει ένας άλλος τρόπος για να επιτευχθεί το ίδιο αποτέλεσμα, μεταβιβάζοντας την εντολή ping απευθείας ως επιχείρημα εάν:

        εάν ping -c 1 IP-ADDRESS; τότε
        echo "Ναι είναι στο διαδίκτυο"
        αλλιώς
        echo "Όχι στο δίκτυο"
        fi

        Αυτό που συμβαίνει είναι ότι εάν αξιολογήσει την τιμή επιστροφής της εντολής που περνάτε ως όρισμα, εάν επιστρέψει 0 είναι αλήθεια, οτιδήποτε άλλο είναι ψευδές. Οι αγκύλες είναι ισοδύναμες με την εντολή δοκιμής. Αλλά μπορείτε να περάσετε οποιαδήποτε εντολή ως όρισμα (εφ 'όσον η εντολή επιστρέφει κάποια τιμή).

  10.   αφορά dijo

    Γεια σας, πώς μπορώ να εκτελέσω ένα script.sh με έναν χρήστη X στο σενάριο Δημιουργώ έναν χρήστη Y και αυτός ο χρήστης Y συνεχίζει να εκτελεί το script.sh

    Μπορεί να γίνει αυτό;

  11.   Κούκτος dijo

    Πολύ ενδιαφέρον, ευχαριστώ!

  12.   Φρανσίσκο dijo

    Ευχαριστώ για τη συνεισφορά, ήμουν μια ώρα για να το καταλάβω xD, αλλά το κατάλαβα !!!!.

  13.   Eloy dijo

    Το σενάριο είναι εντάξει. Αριθμητικά, θα μπορούσε επίσης να γίνει ως ($? == 0) εάν είναι ίσο με μηδέν, δεν βρίσκεται στο δίκτυο, διαφορετικά βρίσκεται στο δίκτυο. Και αν θέλουμε να το κάνουμε λίγο πιο διαδραστικό μπορούμε να πούμε:
    echo -n Εισαγάγετε την IP:
    διαβάστε το ip
    ping -c 1 $ ip

  14.   Dario dijo

    Γεια σας, είμαι πολύ νέος σε αυτό, προσπαθώ να φτιάξω έναν αριθμό εισιτηρίου (αλφαριθμητικό) μέσω μιας ανάγνωσης και θέλω ότι εάν αυτό που έχει εισαχθεί έχει τη σωστή μορφή (ABC-123456) εκτελέστε μια εντολή "x" και δεν το κάνω " Δεν ξέρω πώς να το κάνεις, θα μπορούσες να με βοηθήσεις;

    echo "Εισαγωγή εισιτηρίου"
    διαβάστε -p εισιτήριο

    if $ ticket = "no idea (μορφή ABC-123456"); τότε cp file.txt $ ticket; αλλιώς ηχώ "λάθος μορφή, δοκιμάστε ξανά"? διαβάστε -p; fi.

    Σίγουρα είναι φρικτό και γελούν χαχα, αλλά όπως είπα, ξεκινάω απλώς με αυτό.

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

    Αγκαλιάστε όλους.

  15.   Χάμπερτο Υ dijo

    Εξαιρετική εξήγηση, χαιρετισμούς

  16.   ευκίνητος dijo

    Έχω μια μικρή αμφιβολία με το if, else και άλλους.
    Θέλω ένα σενάριο για να ελέγξω ότι υπάρχει ένα αρχείο (ένα από τα αρχεία καταγραφής) και αν όχι, να το δημιουργήσω και αργότερα να γράψω σε αυτό. Αλλά αν υπάρχει, θέλω απλώς να του γράψετε.

    Αυτό που έχω είναι:

    ημερομηνία = `ημερομηνία -R`
    #Δοκιμάζω τη μεταβλητή ημερομηνία, η οποία δεν ενημερώνεται μεταξύ της έναρξης του α
    #διαδικασία και τελειώνει, μερικές φορές μπορεί να περάσει μια ώρα και να μην βγαίνει η σωστή ώρα.

    εάν [-f /home/user/logs/test.log];
    τότε
    αγγίξτε /home/usuario/logs/test.log
    αλλιώς
    echo "$ date: Updated" >> /home/user/logs/test.log
    ηχώ «———————————————-» >> /home/user/logs/test.log
    fi

    Θεωρητικά θα έπρεπε να είναι εντάξει, αλλά η πραγματικότητα είναι ότι δεν ενημερώνεται εάν το αρχείο αναφοράς υπάρχει ήδη

    1.    ευκίνητος dijo

      συγνώμη, είδα ότι δεν στάλθηκε και έχει διπλασιαστεί