Bash: Kondiĉoj (se-tiam-alie)

Saluton 😀

Ĉi-foje mi montros al vi kiel krei skripton kun kondiĉo en Bash, kiu tradukita estas:

Se X-afero, kiun vi volas, plenumas, Y-ago plenumiĝas, se ĝi ne plenumiĝas, tiam alia ago plenumiĝas.

Simpla klarigo ne 😀

Nun, mi pensis dum kelkaj minutoj pri iu ekzemplo uzota en ĉi tiu lernilo, la sekva dilemo / problemo / situacio okazis al mi:

Ni estas en la reto de nia kompanio, kaj ni volas scii ĉu X-komputilo estas konektita al la reto. Por ĉi tio ni faras skripto kion li faros ping al tiu komputilo, kaj se ĝi estas en reto (tio estas, se ĝi redonas la ping) diros al ni, ke JES, ĝi estas en la reto, alie (tio estas, ĝi ne estas en la reto) ĝi diros al ni, ke ĝi NE estas en la reto.

Post kiam ĉi tio estos farita, nun mi klarigos kiel bicikli kun kondiĉoj 🙂

Jen la kodo:

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

Ne zorgu, mi klarigos ĉi tion al vi detale 😉

ping estas la komando, kiun ni uzos, kaj ĝi diros al ni, ĉu tiu komputilo estas en la reto. Por diri al vi, kiun komputilon ni volas kontroli, ĉu ĝi estas en la reto aŭ ne, ni devas ŝanĝi IP-ADRESO evidente per la IP-adreso de la komputilo, kiun ni volas kontroli.

Kiel vi vidas, mi metis «-c 1«, Kiu estas necesa por ni. Kiam ni pingas komputilon, ĉi tiu ago ne ĉesas (la ping) ĝis ni premas nin mem [Ctrl] + [C], do metante «-c 1»Ni diras al vi, ke vi faru nur unu kontrolon (nur unu ping-provo) kaj neniun alian, ĉi tio haltigos ĝin tuj, tio estas ... ĝi kontrolos, ĉu la komputilo estas en la reto nur unufoje.

Se vi havas dubojn pri tio, neniu doloro ... ili diras tiel kaj mi volonte klarigos ĝin al vi denove 😉

Nun venas la ciklo, ĉar tio, kion mi ĵus klarigis, estas nur normala komando / ago 😀

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

Por ke vi komprenu ĉi tion, mi klarigos ekstreme gravan detalon pri Bash 🙂

La plej sperta pri la temo povus taksi min kiel malĝusta aŭ io simila, sed hej, mi skribas ĉi tion por la novuloj aŭ malpli da spertuloj, se ili komprenas ĝin tiam bonega

Okazas, ke kiel en Bash ĝi estas io tia 0 y 1, tio estas, aŭ vi vivas aŭ vi mortis, kiam ordono aŭ ago estas plenumita: Aŭ bone ekzekutita Nedankinde (1), aŭ estis iuj problemo aŭ eraro (0).

Ni plenumas X-agon aŭ ordonon, kaj tio, kion ni faris, eble bone aŭ malbone plenumiĝis, ĝi eble havis eraron aŭ ne, kaj jen la detalo 😉

Se kion ni sendas fari (ĉi-kaze: ping -c 1 IP-ADRESO) ne donis eraron kaj sukcesis, do ĝi redonos la valoron: 1 . Alie, kaj se la ago (tio estas, la ping) ne sukcesis, ĝi redonos valoron 0.

 Kaj fine, kion signifas la supra kodo, jen:

Se valoro 0 estis redonita tiam

Montri la tekston: «Ne en reto»

Alie (kaj redonu NE 0, sed 1)

Montri la tekston: «Se ĝi estas en reto«

Ĉi tio, kiun mi ĵus klarigis al vi, utilos al ni estontece por multaj aferoj, ĉar estas vere utile povi diri, ke se X-ago donis eraron, faru Y-agon, kaj se X-ago ne donis eraron, lasu Z-agon.

Mi scias, ke iuj povus iom konfuziĝi, do mi provis klarigi ĝin per diversaj manieroj, provante igi ĉiujn kompreni ĝin tiamaniere. Kaze ke iu restos en dubo, sciigu min.

Nun ni kreu nian skripton 😀

Ni devas sekvi la paŝojn en ĉi tiu lernilo: Bash: Kiel fari plenumeblan skripton

Tiam ni kopiu la sekvan kodon en tiun dosieron (skripto.sh), kaj fine ni diru «eliro»(Sen la citiloj):

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

Ĝi devus aspekti tiel (memoru, ke ili certe ŝanĝis la IP-ADRESON al la IP, kiun ili volas):

Ĉi tie vi povas vidi la kurantan skripton:

% CODE1%

 

Kiel vi vidas, finfine li diras al ni «Jes ĝi estas en reto»🙂

La grava afero ĉi tie estas, ke ili efektive komprenas ĉi tion pri la kondiĉoj, do mi lasas al vi alian kodon por klarigi ĝin denove, sed el alia vidpunkto.

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

Kion ĉi tio signifas estas simpla, mi lasas la klarigon linion post linio:

Unua linio: Kion ni skribas, tio estos la valoro de la variablo «texting»(Sen la citiloj).

Dua linio: Kontrolu ĉu la enhavo de la variablo (kion ni ĵus skribis) estas 3.

Unua linio: En kazo de esti 3, ĝi montros al ni la tekston «Correcto»(Sen la citiloj).

4-a linio: Alie (tio estas, se ni ne skribis 3).

5-a linio: Ĝi montros al ni la tekston «Nekorekta»(Sen la citiloj).

6-a linio: Fino de stato.

Kiel ili povis konstati, se ni diros eĥo kaj tiam inter duoblaj citiloj («) teksto, tio igos tiun tekston montriĝi en la terminalo. Tio estas, se ni metas:

echo "esto es una prueba"

Ĝi montros al ni la tekston en la fina stacio: ĉi tio estas provo

Sed revenante al ĉi tiu dua ekzemplo, mi montros al vi la utilecon (kaj plenumadon) de ĉi tiu dua skripto kun io TRE simpla 😀 ... la tipa «kiom kostas 1 + 2?«

Mi lasas la kodon de la kompleta skripto:

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

Jen kiel funkcias la skripto:

% CODE2%

 

Kaj nu ... nenion pli por aldoni.

Ĉi tio estas io elementa, simpla jes, sed tamen mi provis klarigi ĝin kiel eble plej bone, ĉar ne ĉiuj havas la animon de programisto, kaj multfoje ni bezonas fari skriptojn kiel ĉi tiuj (aŭ similaj), ĉiukaze mi esperas, ke ĉi tiu artikolo utilos al vi iu 🙂

Ajna dubo aŭ demando, plendo aŭ sugesto bonvolu lasi ĝin ĉi tie, mi volonte respondos al vi kaj tiel, ni ĉiuj lernas iom pli 😀

salutoj


La enhavo de la artikolo aliĝas al niaj principoj de redakcia etiko. Por raporti eraron alklaku Ĉi tie.

26 komentoj, lasu la viajn

Lasu vian komenton

Via retpoŝta adreso ne estos eldonita. Postulita kampojn estas markita per *

*

*

  1. Respondeculo pri la datumoj: Miguel Ángel Gatón
  2. Celo de la datumoj: Kontrola SPAM, administrado de komentoj.
  3. Legitimado: Via konsento
  4. Komunikado de la datumoj: La datumoj ne estos komunikitaj al triaj krom per laŭleĝa devo.
  5. Stokado de datumoj: Datumbazo gastigita de Occentus Networks (EU)
  6. Rajtoj: Iam ajn vi povas limigi, retrovi kaj forigi viajn informojn.

  1.   jhals diris

    Vi estas profesiulo !!! * aŭ *

    1.    KZKG ^ Gaara diris

      Nah por nenio 😀
      Se ĝi servis vin kaj ĝi estas interesa, mi estas kontenta 😉

      Salutojn amiko

  2.   taŭga diris

    @ KZKG ^ Gaara,
    parolante pri bash-programado, mi havas demandon:
    Kio estas la diferenco inter deklari variablon kiel ĉi tiun VAR = saluton kaj deklari ĝin tiel VAR = $ {VAR: -hello}?

    Mi klarigas:
    http://pastebin.com/a3cfWXeD

    salutojn 😉

    1.    KZKG ^ Gaara diris

      Saluton 😀
      Nu, mi tute ne spertas pri bash ... efektive, mi tute ne scias LOL !!
      Dum mi deklaras la variablojn, ĝi estas tiel:
      : ${OPTFOLDER:="/opt/"}

      Sed ĉar mi ĉiam tiel faris, mi ne scias, kio povus esti la diferenco honeste 🙁

  3.   taŭga diris

    @ KZKG ^ Gaara
    Nu mi demandis la demandon ĉar la vero estas, ke ankaŭ mi ne sciis, mi kutime verkas SlackBuilds kaj la vero estas, ke variabloj deklaritaj kiel en VAR1 abundas en ĉi tiuj skriptoj. Rapida gugla serĉo helpis min klarigi ĉi tiun demandon, mi dividas ĝin kun ĉiuj por ke ni ĉiuj lernu:

    Skripto:
    http://pastebin.com/faAQb35w

    Klarigo:
    Deklari variablojn laŭ la formo VAR = $ {VAR: -default_value} signifas, ke la variablo VAR prenos la valoron default_value se kaj nur se la valoro estas nula aŭ ne ekzistas.

    Praktika ekzemplo:
    Dum plenumado de la skripto, oni petas enigi valoron konservotan en la variablo VAR, se io estas enirita, ĝi montros tion, kio estis enirita. Se ni enigas ion kaj premas enen, ni deklaras la variablon VAR kiel nula, tial ĝi montras value_default.

    Salutojn.

    1.    KZKG ^ Gaara diris

      HAHA Mi ne sciis tion 😀
      Bone, dankegon amiko ... tion mi celis per la fino de la artikolo, mi ne intencas instrui ion kaj jen, mi scias, ke mi ĉiam lernos ion novan ĉi tie 😀

      Saluton kaj dankon denove.

      1.    taŭga diris

        vi pravas, oni lernas plurajn aferojn ĉi tie.

        salutojn kaj feliĉajn festojn !! 😀

  4.   Lucas Matiaso diris

    Terura kaj bonege klarigita +1, la tempo, kiun ĝi prenis al vi ...
    sed mi valoras la penon 😉

    1.    KZKG ^ Gaara diris

      Fakte mi skribis 80% en nur 1 tago, mi bezonis tiel longe publikigi ĝin nur ĉar mia interreto ne permesis al mi.
      Dankon pro via komento 😉

  5.   Hugo diris

    Alia maniero fari ĝin estas uzi DNS, ĉar kelkfoje retoj havas ICMP-protokolon blokita:

    (gastiganto -ta IP-ADRESO> / dev / null 2> & 1) && echo "Konektita al reto"

    Vi ankaŭ rimarkos, ke en ĉi tiu ekzemplo la revena valora kontrolo estas implicita 😉

    1.    KZKG ^ Gaara diris

      Vi kiel ĉiam amiko, kun konsiloj, kiujn mi ne scias tute HAHAHA.
      Dankon, la komento dankas kaj hehe ... alia nova afero, kiun mi lernas 😀

  6.   Datumo diris

    danke

    🙂

  7.   Leprulo_Ivan diris

    Kvankam kelkaj tagoj pasis post la publikigo de ĉi tiu temo, ĝi multe servis al mi, nun kiam mi faris skripton en bash. Dankon Gaara ..

  8.   Edgar navarro diris

    Doktoro. Dankon pro la helpo, ke vi klarigis aferojn por mi.

    Nur demando, kiel mi faras, ke kiam unu komputilo ĉesas pingi aŭtomate la alia ŝanĝas IP. Mi havas ĉi tion.

    ŝanĝi la IP
    #! / bin / bash
    ping -c 10 192.168.1.50 # Se ĝi ne ping aŭtomate
    ifconfig eth0 192.168.1.50 retmasko 255.255.255.0 elsendo 192.168.1.0
    ifconfig eth0 malsupren
    ifconfig eth0 supren

  9.   Abraham diris

    ĉar kiam vi komparas kun la se vi uzas la demandosignon? kia diferenco estas inter meti la? iu ajn alia letero

    1.    KZKG ^ Gaara diris

      $? signifas 'la antaŭa eligo aŭ eligo', tio estas, se la rezulto de la antaŭa komando ... 🙂

      1.    Andreo diris

        Estas alia maniero atingi la saman rezulton, pasante la komandon ping rekte kiel argumenton al se:

        se ping -c 1 IP-ADRESO; tiam
        eoo "Jes, ĝi estas en la reto"
        alia
        eoo "Ne en la reto"
        fi

        Kio okazas estas, ke se taksas la redonan valoron de la komando, kiun vi pasigas kiel argumenton, se ĝi redonas 0, ĝi estas vera, ĉio alia estas falsa. La kvadrataj krampoj samvaloras al la testkomando. Sed vi povas pasigi iun ajn komandon kiel argumenton (kondiĉe ke la komando redonas iun valoron).

  10.   salutoj diris

    Saluton, kiel mi ekzekutas script.sh kun uzanto X en la skripto mi kreas uzanton Y, kaj tiu uzanto Y daŭre plenumas la script.sh

    Ĉu tio povas esti farita ??

  11.   kuktos diris

    Tre interesa, dankon!

  12.   francisco diris

    Dankon pro la kontribuo, mi estis horo por kompreni ĝin xD, sed mi komprenis ĝin !!!!.

  13.   eloy diris

    La skripto bonas. Aritmetike ĝi povus fariĝi ankaŭ kiel ($? == 0) se ĝi egalas al nulo, ĝi ne estas en la reto, alie ĝi estas en la reto. Kaj se ni ankoraŭ volas fari ĝin iom pli interaga, ni povas diri:
    echo -n Enigu la IP:
    legi ip
    ping -c 1 $ ip

  14.   Dario diris

    Saluton, mi tre novas pri tio, mi provas krei biletan numeron (alfanombran) per legado kaj mi volas, ke se tio, kio estas enirita, havas la ĝustan formaton (ABC-123456), plenumu ordonon "x" kaj mi ne scias kiel fari ĝin, ĉu vi povus helpi min?

    eoo "Enigu bileton"
    legi -p bileton

    se $ bileto = "neniu ideo (formato ABC-123456"); tiam cp file.txt $ bileto; else eoas "Malĝusta formato, reprovu"; legi -p; fi.

    Certe ĝi estas terura kaj ili ridas haha, sed kiel mi diris, mi ĵus komencas kun ĉi tio.

    Se mi malbone klarigas bonvolu diri al mi kaj mi provas fari pli bone.

    Brakumu ĉiujn.

  15.   Umberto Y diris

    Bonega klarigo, salutojn

  16.   lerta diris

    Mi iom dubas pri se, alia kaj aliaj.
    Mi volas skripton por kontroli ke dosiero ekzistas (unu el protokoloj) kaj se ne, por krei ĝin kaj poste skribi al ĝi. Sed se ĝi ekzistas, mi volas, ke vi nur skribu al ĝi.

    Kion mi havas estas:

    dato = `dato -R`
    #Mi estis provanta varian daton, kiu ne estas ĝisdatigita inter la komenco de a
    #proceso kaj finiĝas, foje povas pasi horo kaj la ĝusta tempo ne eliras.

    if [-f /home/user/logs/test.log];
    tiam
    tuŝu /home/uzanto/logs/test.log
    alia
    echo "$ dato: Ĝisdatigita" >> /home/user/logs/test.log
    echo «———————————————-» >> /home/user/logs/test.log
    fi

    En teorio ĝi devus esti bone, sed la realo estas ke ĝi ne estas ĝisdatigita se la referencita dosiero jam ekzistas

    1.    lerta diris

      pardonu, mi vidis, ke ĝi ne estis sendita kaj ĝi duobliĝis