Bash: condizioni (if-then-else)

Ciao

Questa volta ti mostrerò come creare uno script con condition in Bash, che tradotto è:

Se X cosa si desidera è stata eseguita, l'azione Y è completata, se non viene eseguita, viene eseguita un'altra azione.

Semplice spiegazione no 😀

Ora, ho pensato per alcuni minuti a qualche esempio da utilizzare in questo tutorial, mi è venuto in mente il seguente dilemma / problema / situazione:

Siamo sulla rete della nostra azienda e vogliamo sapere se il computer X è connesso alla rete. Per questo realizziamo un file copione che cosa farà ping verso quel computer, e se è su una rete (cioè, se restituisce il file ping) ci dirà che SI, è sulla rete, altrimenti (cioè non è sulla rete) ci dirà che NON è sulla rete.

Una volta fatto ciò, ora spiegherò come ciclare con le condizioni 🙂

Ecco il codice:

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

Non preoccuparti, te lo spiego in dettaglio 😉

ping è il comando che useremo e ci dirà se quel PC è in rete. Per dirti quale PC vogliamo controllare se è in rete o meno, dobbiamo cambiare INDIRIZZO IP ovviamente dall'indirizzo IP del PC che vogliamo controllare.

Come puoi vedere, metto «-c 1«, Che ci è necessario. Quando eseguiamo il ping di un computer, questa azione non si ferma (il ping) fino a quando non premiamo noi stessi [Ctrl] + [C], così mettendo «-c 1»Vi diciamo di fare una sola verifica (solo un tentativo di ping) e nessun altro, questo lo farà fermare istantaneamente, cioè… controllerà se il computer è in rete solo una volta.

Se hai dubbi su questo, nessun dolore ... lo dicono e io glielo spiegherò di nuovo 😉

Ora arriva il ciclo, perché quello che ho appena spiegato non è altro che un normale comando / azione 😀

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

Affinché tu lo capisca, spiegherò un dettaglio estremamente importante di Bash 🙂

Il più esperto dell'argomento potrebbe etichettarmi come sbagliato o qualcosa del genere, ma hey, lo scrivo per i principianti o meno esperti, purché lo capiscano bene

Succede che come in Bash è qualcosa di simile 0 y 1, cioè, o sei vivo o sei morto, quando viene eseguito un comando o un'azione: O ben eseguito Nessun problema (1), A ce n'erano alcuni problema o errore (0).

Eseguiamo l'azione o il comando X e ciò che abbiamo fatto potrebbe essere stato eseguito bene o male, potrebbe aver avuto un errore o meno, ed è qui che si trovano i dettagli 😉

Se quello che inviamo per fare (in questo caso: ping -c 1 INDIRIZZO IP) non ha dato un errore ed è andato a buon fine, quindi restituirà il valore: 1 . In caso contrario, e se l'azione (ovvero il ping) non ha avuto successo, restituirà il valore 0.

 E infine, ciò che significa il codice sopra è questo:

Se è stato restituito il valore 0, allora

Visualizza il testo: «Non in rete»

Altrimenti (e NON 0, ma viene restituito 1)

Visualizza il testo: «Se è in rete«

Ciò che ti ho appena spiegato, ci servirà in futuro per molte cose, perché è davvero utile poter dire che se l'azione X ha dato un errore, fai l'azione Y, e nel caso l'azione X non ha dato un errore, quindi eseguire l'azione Z.

So che alcuni potrebbero essere un po 'confusi, quindi ho cercato di spiegarlo in molti modi diversi, cercando di farlo capire a tutti in un modo o nell'altro. Nel caso qualcuno rimanga in dubbio, fammelo sapere.

Ora, creiamo il nostro script 😀

Dobbiamo seguire i passaggi in questo tutorial: Bash: come creare uno script eseguibile

Quindi copiamo il seguente codice in quel file (script.sh), e alla fine diciamo «exit»(Senza virgolette):

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

Dovrebbe assomigliare a questo (ricorda che devono aver cambiato l'IP-ADDRESS nell'IP che vogliono):

Qui puoi vedere lo script in esecuzione:

% CODE1%

Come puoi vedere, alla fine ci dice «Sì, è in rete»🙂

La cosa importante qui è che effettivamente capiscano questa delle condizioni, quindi vi lascio un altro codice per spiegarlo di nuovo, ma da un altro punto di vista.

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

Ciò che significa è semplice, lascio la spiegazione riga per riga:

1a riga: Quello che scriviamo, sarà il valore della variabile «testo»(Senza virgolette).

2a riga: Controlla se il contenuto della variabile (quello che abbiamo appena scritto) lo è 3.

3a riga: In caso di essere 3, ci mostrerà il testo «Correggere»(Senza virgolette).

4a riga: Altrimenti (cioè, nel caso in cui non abbiamo scritto 3).

5a riga: Ci mostrerà il testo «Sbagliato»(Senza virgolette).

6a riga: Fine della condizione.

Come hanno saputo realizzare, se mettiamo eco e poi tra virgolette doppie («) un testo, questo farà sì che quel testo venga visualizzato nel terminale. Cioè, se mettiamo:

echo "esto es una prueba"

Ci mostrerà il testo nel terminale: questa è una prova

Ma tornando a questo secondo esempio, ti mostrerò l'utilità (e l'esecuzione) di questo secondo script con qualcosa di MOLTO semplice 😀… il tipico «quanto fa 1 + 2?«

Vi lascio il codice dello script completo:

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

Ecco come funziona lo script:

% CODE2%

E beh ... niente altro da aggiungere.

Questo è qualcosa di elementare, semplice sì, ma comunque ho cercato di spiegarlo nel miglior modo possibile, perché non tutti hanno l'anima di un programmatore, e tante volte abbiamo bisogno di fare script come questi (o simili), in ogni caso spero che questo articolo ti sia utile qualcuno 🙂

Qualsiasi dubbio o domanda, reclamo o suggerimento per favore, lascialo qui, ti risponderò volentieri e quindi impareremo un po 'di più 😀

saluti


Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile dei dati: Miguel Ángel Gatón
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.

  1.   jhal suddetto

    Sei un professionista !!! *o*

    1.    KZKG ^ Gaara suddetto

      Nah per niente 😀
      Se ti è servito ed è interessante, sono soddisfatto 😉

      Saluti amico

  2.   corretto suddetto

    @ KZKG ^ Gaara,
    parlando di programmazione bash ho una domanda:
    Qual è la differenza tra dichiarare una variabile come questa VAR = hello e dichiararla come questa VAR = $ {VAR: -hello}?

    Io spiego:
    http://pastebin.com/a3cfWXeD

    saluti 😉

    1.    KZKG ^ Gaara suddetto

      Ciao
      Beh, non sono affatto un esperto di bash ... in realtà, non ho idea di LOL !!
      Mentre dichiaro le variabili è così:
      : ${OPTFOLDER:="/opt/"}

      Ma poiché l'ho sempre fatto così, non so quale potrebbe essere la differenza onestamente 🙁

  3.   corretto suddetto

    @ KZKG ^ Gaara
    Beh, ho posto la domanda perché la verità è che nemmeno io lo sapevo, di solito scrivo SlackBuilds e la verità è che le variabili dichiarate come in VAR1 abbondano in questi script. Una rapida ricerca su google mi ha aiutato a chiarire questa domanda, la condivido con tutti in modo che tutti possiamo imparare:

    script:
    http://pastebin.com/faAQb35w

    Spiegazione:
    Dichiarare variabili della forma VAR = $ {VAR: -default_value} significa che la variabile VAR assumerà il valore default_value se e solo se il valore è nullo o non esiste.

    Esempio pratico:
    Quando si esegue lo script, viene chiesto di inserire un valore da memorizzare nella variabile VAR, se viene inserito qualcosa mostrerà cosa è stato inserito. Se non inseriamo nulla e premiamo invio dichiariamo la variabile VAR come nulla, quindi mostra value_default.

    Saluti.

    1.    KZKG ^ Gaara suddetto

      HAHA Non lo sapevo 😀
      Ok, grazie mille amico ... è quello che intendevo alla fine dell'articolo, non ho intenzione di insegnare qualcosa e basta, so che imparerò sempre qualcosa di nuovo qui 😀

      Saluti e grazie ancora.

      1.    corretto suddetto

        hai ragione, qui si imparano diverse cose.

        saluti e buone feste !! 😀

  4.   Luca Matias suddetto

    Fantastico e spiegato in modo eccellente +1, il tempo che ti ci vorrà ...
    ma valgo lo sforzo 😉

    1.    KZKG ^ Gaara suddetto

      In realtà ho scritto l'80% in un solo giorno, mi ci è voluto così tanto per pubblicarlo solo perché il mio Internet non me lo permetteva.
      Grazie per il tuo commento 😉

  5.   Hugo suddetto

    Un altro modo per farlo è utilizzare il DNS, poiché a volte le reti hanno il protocollo ICMP bloccato:

    (host -ta IP-ADDRESS> / dev / null 2> & 1) && echo "Connesso alla rete"

    Noterai anche che in questo esempio il controllo del valore restituito è implicito 😉

    1.    KZKG ^ Gaara suddetto

      Tu come sempre amico, con consigli che non conosco completamente HAHAHA.
      Grazie, il commento è apprezzato e hehe… un'altra cosa nuova che imparo 😀

  6.   Data suddetto

    grazie

    🙂

  7.   Leper_Ivan suddetto

    Anche se sono passati diversi giorni dalla pubblicazione di questo argomento, mi è servito molto, ora che ho fatto un copione in bash .. Grazie Gaara ..

  8.   Edgar navarro suddetto

    Doc. Grazie per l'aiuto che mi hai chiarito le cose.

    Solo una domanda, come faccio in modo che quando un computer smette di eseguire automaticamente il ping, l'altro cambia IP. Ho questo.

    per cambiare l'IP
    #! / Bin / bash
    ping -c 10 192.168.1.50 # Se non esegue il ping automaticamente
    ifconfig eth0 192.168.1.50 maschera di rete 255.255.255.0 trasmissione 192.168.1.0
    ifconfig eth0 inattivo
    ifconfig eth0 su

  9.   Abraham suddetto

    perchè in confronto con il se usi il punto interrogativo? che differenza c'è tra mettere il? qualsiasi altra lettera

    1.    KZKG ^ Gaara suddetto

      $? significa 'l'output precedente', cioè nel caso in cui il risultato del comando precedente ... 🙂

      1.    Andrew suddetto

        C'è un altro modo per ottenere lo stesso risultato, passando il comando ping direttamente come argomento a if:

        se ping -c 1 INDIRIZZO IP; poi
        echo "Sì, è in rete"
        altro
        echo "Non in rete"
        fi

        Quello che succede è che se valuta il valore di ritorno del comando che passi come argomento, se restituisce 0 è vero, qualsiasi altra cosa è falsa. Le parentesi quadre sono equivalenti al comando di test. Ma puoi passare qualsiasi comando come argomento (purché il comando restituisca un valore).

  10.   saluti suddetto

    Ciao, come eseguo uno script.sh con un utente X nello script creo un utente Y e quell'utente Y continua a eseguire script.sh

    Può essere fatto ??

  11.   Kuctos suddetto

    Molto interessante, grazie!

  12.   Francisco suddetto

    Grazie per il contributo, sono stata un'ora a capirlo xD, ma l'ho capito !!!!.

  13.   Eloy suddetto

    Lo script va bene. Aritmeticamente potrebbe anche essere fatto come ($? == 0) se è uguale a zero non è sulla rete, altrimenti è sulla rete. E se vogliamo ancora renderlo un po 'più interattivo possiamo dire:
    echo -n Immettere l'IP:
    leggi ip
    ping -c 1 $ ip

  14.   Dario suddetto

    Ciao, sono molto nuovo in questo, sto cercando di creare un numero di ticket (alfanumerico) tramite una lettura e voglio che se ciò che viene inserito ha il formato corretto (ABC-123456) esegua un comando "x" e non lo faccio Non so come farlo, potresti aiutarmi?

    echo "Inserisci biglietto"
    leggi -p biglietto

    if $ ticket = "nessuna idea (formato ABC-123456"); quindi cp file.txt $ ticket; else echo "Formato errato, riprova"; leggi -p; fi.

    Certo è orribile e ridono ahah, ma come ho detto ho appena iniziato con questo.

    Se ti spiego male per favore dimmelo e cerco di fare meglio.

    Abbraccia tutti.

  15.   Umberto Y suddetto

    Ottima spiegazione, saluti

  16.   agile suddetto

    Ho un piccolo dubbio con if, else e altri.
    Voglio uno script per verificare l'esistenza di un file (uno dei registri) e, in caso contrario, per crearlo e successivamente scriverci sopra. Ma se esiste, voglio che tu ci scriva.

    Quello che ho è:

    data = `data -R`
    #Stavo testando la data variabile, che non viene aggiornata tra l'inizio di a
    #processo e finisce, a volte può passare un'ora e l'ora esatta non esce.

    if [-f /home/user/logs/test.log];
    poi
    tocca /home/usuario/logs/test.log
    altro
    echo "$ date: Aggiornato" >> /home/user/logs/test.log
    echo «———————————————-» >> /home/user/logs/test.log
    fi

    In teoria dovrebbe andare bene, ma la realtà è che non viene aggiornato se il file di riferimento esiste già

    1.    agile suddetto

      scusa, ho visto che non è stato inviato ed è raddoppiato