Bash: Koşullar (eğer-ise-değilse)

Merhaba

Bu sefer size koşullu bir komut dosyasının nasıl yapılacağını göstereceğim. Cümbüş, çevrilen:

İstediğiniz X işlemi yapılırsa Y işlemi yapılır, yapılmazsa başka bir işlem yapılır.

Basit açıklama hayır 😀

Şimdi, bu eğitimde kullanmak için bir örnek hakkında birkaç dakika düşündüm, şu ikilem / sorun / durum aklıma geldi:

Şirketimizin ağındayız ve X bilgisayarın ağa bağlı olup olmadığını bilmek istiyoruz. Bunun için bir senaryo ne yapacak ping o bilgisayara doğru ve bir ağ üzerindeyse (yani, ping) bize EVET'in ağda olduğunu, aksi takdirde (yani, ağda olmadığını) bize ağda OLMADIĞINI söyleyecektir.

Bu yapıldıktan sonra, şimdi koşullarla nasıl döngü yapılacağını açıklayacağım 🙂

İşte kod:

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

Merak etmeyin, bunu size detaylı olarak açıklayacağım 😉

ping kullanacağımız komuttur ve bize bu bilgisayarın ağda olup olmadığını söyleyecektir. Ağda olup olmadığını kontrol etmek istediğimiz bilgisayarı size söylemek için, değiştirmeliyiz IP ADRESİ açıkça, kontrol etmek istediğimiz bilgisayarın IP adresi.

Gördüğünüz gibi "-c1«, Bizim için gerekli olan. Bir bilgisayara ping attığımızda, kendimize baskı yapana kadar bu eylem (ping) durmaz. [Ctrl] + [C]yani «-c1»Size yalnızca bir doğrulama (yalnızca bir ping denemesi) yapmanızı söylüyoruz ve başka bir şey yapmıyoruz, bu onu anında durduracak, yani… bilgisayarın ağda olup olmadığını yalnızca bir kez kontrol edecek.

Bununla ilgili şüpheniz varsa, acı yok ... Söylüyorlar ve ben de onlara tekrar açıklayacağım 😉

Şimdi döngü geliyor, çünkü az önce açıkladığım şey normal bir komut / eylemden başka bir şey değil 😀

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

Bunu anlamanız için, Bash'in son derece önemli bir detayını açıklayacağım 🙂

Konuyla ilgili en bilgili olan beni yanlış veya bunun gibi bir şey olarak damgalayabilir, ama hey, bunu acemiler veya daha az uzmanlar için yazıyorum, anladıkları sürece harika

Olduğu gibi olur Cümbüş gibi bir şey 0 y 1yani, bir komut veya eylem yürütüldüğünde ya hayattasın ya da öldün: Ya iyi idam Sorun değil (1), A biraz vardı sorun veya hata (0).

X eylemini veya komutunu gerçekleştiririz ve yaptığımız şey iyi veya kötü bir şekilde gerçekleştirilmiş olabilir, bir hata olabilir veya olmayabilir ve ayrıntı burada 😉

Yapmak için ne gönderirsek (bu durumda: ping -c 1 IP-ADRESİ) bir hata vermedi ve başarılı oldu, bu nedenle şu değeri döndürecektir: 1 . Aksi takdirde, eylem (yani ping) başarılı olmazsa, değer döndürür. 0.

 Ve son olarak, yukarıdaki kodun anlamı şudur:

0 değeri döndürülmüşse

Metni görüntüleyin: «Ağda değil»

Aksi takdirde (0 DEĞİL, ancak 1 döndürülür)

Metni görüntüleyin: «Ağdaysa«

Size az önce açıkladığım bu, gelecekte birçok şey için bize hizmet edecek, çünkü eğer X eylemi bir hata veriyorsa, Y eylemi yap ve X eylemi bir hata vermediyse, demek gerçekten yararlıdır. hata, sonra Z eylemi yapın.

Bazılarının kafasının biraz karışabileceğini biliyorum, bu yüzden bunu birkaç farklı şekilde açıklamaya çalıştım, herkesin bir şekilde anlamasını sağlamaya çalıştım. Herhangi birinin şüpheye düşmesi durumunda bana bildirin.

Şimdi senaryomuzu yapalım 😀

Bu öğreticideki adımları izlemeliyiz: Bash: Çalıştırılabilir bir komut dosyası nasıl yapılır

O halde aşağıdaki kodu o dosyaya kopyalayalım (komut dosyası.sh) ve sonunda şunu söyleyelim «çıkış»(Tırnak işaretleri olmadan):

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

Şöyle görünmelidir (IP-ADRESİNİ istedikleri IP ile değiştirmiş olmaları gerektiğini unutmayın):

Burada çalışan komut dosyasını görebilirsiniz:

% CODE1%

Gördüğünüz gibi, sonunda bize şunu söylüyor «Evet ağda»🙂

Burada önemli olan, bunu koşullar hakkında gerçekten anlamanızdır, bu yüzden size tekrar açıklamak için başka bir kod bırakıyorum, ama başka bir açıdan.

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

Bunun anlamı basit, açıklamayı satır satır bırakıyorum:

1. satır: Ne yazıyoruz, bu değişkenin değeri olacak «metin»(Tırnak işaretleri olmadan).

2. satır: Değişkenin içeriğinin (az önce yazdığımız) 3.

3. satır: Olması durumunda 3, bize şu metni gösterecek «Düzelt»(Tırnak işaretleri olmadan).

4. satır: Aksi takdirde (yani, 3 yazmamışsak).

5. satır: Bize şu metni gösterecek «Yanlış»(Tırnak işaretleri olmadan).

6. satır: Koşulun sonu.

Farkına varabildikleri gibi, koyarsak kaçırmak ve sonra çift tırnak arasında («) bir metin, bu metnin terminalde görüntülenmesine neden olacaktır. Yani, koyarsak:

echo "esto es una prueba"

Bize terminaldeki metni gösterecek: bu bir test

Ama bu ikinci örneğe geri dönersek, size bu ikinci senaryonun faydasını (ve yürütülmesini) ÇOK basit bir şeyle göstereceğim - ... tipik olan «1 + 2 ne kadar?«

Size tüm komut dosyasının kodunu bırakıyorum:

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

Komut dosyası şu şekilde çalışır:

% CODE2%

Ve pekala ... ekleyecek başka bir şey yok.

Bu basit bir şey, evet, ama yine de mümkün olduğunca iyi açıklamaya çalıştım, çünkü herkes bir programcı ruhuna sahip değil ve çoğu zaman bunun gibi (veya benzeri) betikler yapmamız gerekiyor, her durumda I umarım bu makale birisine faydalı olur 🙂

Herhangi bir şüphe veya soru, şikayet veya öneri lütfen burada bırakın, size memnuniyetle cevap vereceğim ve böylece hepimiz biraz daha öğreneceğiz 😀

selamlar


Yorumunuzu bırakın

E-posta hesabınız yayınlanmayacak. Gerekli alanlar ile işaretlenmiştir *

*

*

  1. Verilerden sorumlu: Miguel Ángel Gatón
  2. Verilerin amacı: Kontrol SPAM, yorum yönetimi.
  3. Meşruiyet: Onayınız
  4. Verilerin iletilmesi: Veriler, yasal zorunluluk dışında üçüncü kişilere iletilmeyecektir.
  5. Veri depolama: Occentus Networks (AB) tarafından barındırılan veritabanı
  6. Haklar: Bilgilerinizi istediğiniz zaman sınırlayabilir, kurtarabilir ve silebilirsiniz.

  1.   Jhal'ler dijo

    Sen profesyonelsin !!! *veya*

    1.    KZKG ^ Gaara dijo

      Hiçbir şey için yok 😀
      Size hizmet ettiyse ve ilginçse, memnunum 😉

      Selam arkadaşım

  2.   uygun dijo

    @ KZKG ^ Gaara,
    bash programlamadan bahsetmişken bir sorum var:
    Bu VAR = merhaba gibi bir değişkeni bildirmekle bunu bu VAR = $ {VAR: -hello} gibi bildirmek arasındaki fark nedir?

    Açıklarım:
    http://pastebin.com/a3cfWXeD

    selamlar 😉

    1.    KZKG ^ Gaara dijo

      Merhaba
      Şey, bash konusunda hiç uzman değilim ... aslında, LOL hakkında hiçbir fikrim yok !!
      Değişkenleri açıkladığım gibi bu şöyle:
      : ${OPTFOLDER:="/opt/"}

      Ama bunu her zaman böyle yaptığım için dürüstçe fark ne olabilir bilmiyorum 🙁

  3.   uygun dijo

    @ KZKG ^ Gaara
    Soruyu sordum çünkü gerçek şu ki ben de bilmiyordum, genellikle SlackBuilds yazarım ve gerçek şu ki, VAR1'de olduğu gibi bildirilen değişkenler bu betiklerde bol miktarda bulunur. Hızlı bir google araması bu soruyu netleştirmeme yardımcı oldu, hepimiz öğrenebilmemiz için bunu herkesle paylaşıyorum:

    Senaryo:
    http://pastebin.com/faAQb35w

    Açıklama:
    VAR = $ {VAR: -varsayılan_değer} biçimindeki değişkenlerin bildirilmesi, VAR değişkeninin varsayılan_değer değerini yalnızca ve ancak değer boş ise veya yoksa alacağı anlamına gelir.

    Pratik örnek:
    Script çalıştırılırken, VAR değişkeninde saklanacak bir değer girilmesi istenir, eğer bir şey girilirse, ne girildiğini gösterecektir. Hiçbir şey girmezsek ve enter tuşuna basarsak, VAR değişkenini null olarak ilan etmiş oluruz, dolayısıyla değer_default değerini gösterir.

    Selamlar.

    1.    KZKG ^ Gaara dijo

      HAHA bunu bilmiyordum 😀
      Tamam, çok teşekkür ederim arkadaşım ... makalenin sonunda demek istediğim buydu, bir şey öğretmek niyetinde değilim ve işte bu, burada her zaman yeni bir şeyler öğreneceğimi biliyorum

      Selamlar ve tekrar teşekkürler.

      1.    uygun dijo

        haklısın, burada birkaç şey öğrenilir.

        selamlar ve mutlu tatiller !! 😀

  4.   Lucas Matthias dijo

    Çok iyi ve mükemmel bir şekilde açıklanmış +1, size ne kadar zaman harcadı ...
    ama çabaya değerim 😉

    1.    KZKG ^ Gaara dijo

      Aslında% 80'i 1 günde yazdım, internetim izin vermediği için yayınlamam çok uzun sürdü.
      Yorumunuz için teşekkürler 😉

  5.   Hugo dijo

    Bunu yapmanın başka bir yolu DNS kullanmaktır, çünkü bazen ağlarda ICMP protokolü engellenir:

    (ana bilgisayar -ta IP-ADRESİ> / dev / null 2> & 1) && echo "Ağa bağlı"

    Ayrıca bu örnekte dönüş değeri kontrolünün örtük olduğunu da fark edeceksiniz 😉

    1.    KZKG ^ Gaara dijo

      Sen her zamanki gibi arkadaşım, HAHAHA'yı tamamen bilmediğim ipuçlarıyla.
      Teşekkür ederim, yorum takdir edildi ve hehe… öğrendiğim yeni bir şey daha 😀

  6.   Tarih dijo

    teşekkürler

    🙂

  7.   Leper_Ivan dijo

    Bu konunun yayınlanmasının üzerinden günler geçmesine rağmen, bash'ta bir senaryo hazırladığım için bana çok hizmet etti. Teşekkürler Gaara ..

  8.   Edgar navarro dijo

    Doktor, işleri benim için netleştirdiğiniz yardım için teşekkürler.

    Sadece bir sorgu, bir bilgisayar otomatik olarak ping yapmayı bıraktığında diğerinin IP'yi değiştirmesini nasıl yaparım. Bu bende var.

    IP'yi değiştirmek için
    #! / Bin / bash
    ping -c 10 192.168.1.50 # Otomatik olarak ping yapmıyorsa
    ifconfig eth0 192.168.1.50 netmask 255.255.255.0 yayın 192.168.1.0
    ifconfig eth0 aşağı
    ifconfig eth0 yukarı

  9.   İbrahim dijo

    çünkü soru işaretini kullanırsanız ile karşılaştırırken? koymak arasında ne fark var? başka herhangi bir mektup

    1.    KZKG ^ Gaara dijo

      $? 'önceki çıktı' anlamına gelir, yani önceki komutun sonucu olması durumunda ... 🙂

      1.    Andrew dijo

        Aynı sonucu elde etmenin başka bir yolu var, ping komutunu doğrudan bir argüman olarak iletmek için:

        ping -c 1 IP-ADRESİ ise; sonra
        echo "Evet, internette"
        başka
        echo "Ağda değil"
        fi

        Olan şu ki, ilettiğiniz komutun dönüş değerini bir argüman olarak değerlendirirse, 0 döndürürse bu doğrudur, başka herhangi bir şey yanlıştır. Köşeli parantezler test komutuna eşdeğerdir. Ancak herhangi bir komutu argüman olarak iletebilirsiniz (komut bir değer döndürdüğü sürece).

  10.   selamlar dijo

    Merhaba, komut dosyasında bir X kullanıcısı ile bir script.sh dosyasını nasıl çalıştırırım Bir kullanıcı Y oluşturuyorum ve bu Y kullanıcısı script.sh'yi çalıştırmaya devam ediyor

    Bu yapılabilir mi?

  11.   kuktolar dijo

    Çok ilginç, teşekkürler!

  12.   Francisco dijo

    Katkı için teşekkürler, xD'yi anlamak için bir saatim oldu ama anladım !!!!.

  13.   Eloy dijo

    Senaryo gayet iyi. Aritmetik olarak, sıfıra eşitse ($? == 0) olarak da yapılabilir, ağda değil, aksi takdirde ağdadır. Ve yine de onu biraz daha etkileşimli hale getirmek istiyorsak şunu söyleyebiliriz:
    echo -n IP'yi girin:
    ip oku
    ping -c 1 $ ip

  14.   Dario dijo

    Merhaba, bu konuda çok yeniyim, okuma yoluyla bir bilet numarası (alfanümerik) yapmaya çalışıyorum ve girilenin doğru biçime sahip olması durumunda (ABC-123456) bir "x" komutunu çalıştırmasını istiyorum ve yapmam. nasıl yapılacağını bilmiyorum, bana yardım edebilir misin?

    echo "Bilet gir"
    -p bileti oku

    $ ticket = "fikrim yok (ABC-123456 formatı"); sonra cp file.txt $ ticket; else echo "Yanlış format, tekrar dene"; -p okuyun; fi.

    Elbette korkunç ve gülüyorlar haha, ama dediğim gibi bununla başlıyorum.

    Kötü açıklarsam lütfen bana söyleyin ve daha iyisini yapmaya çalışıyorum.

    Herkese sarılın.

  15.   Umberto Y dijo

    Mükemmel açıklama, selamlar

  16.   çevik dijo

    if, else ve diğerleriyle ilgili biraz şüphem var.
    Bir dosyanın var olduğunu (günlüklerden biri) kontrol etmek ve değilse, onu oluşturmak ve daha sonra ona yazmak için bir komut dosyası istiyorum. Ama eğer varsa, sadece yazmanı istiyorum.

    Sahip olduğum şey:

    tarih = 'tarih -R'
    #Bir başlangıç ​​arasında güncellenmeyen değişken tarihi test ediyordum.
    #işlem bitiyor bazen bir saat geçebiliyor ve doğru zaman çıkmıyor.

    eğer [-f /home/user/logs/test.log];
    sonra
    /home/usuario/logs/test.log'a dokunun
    başka
    echo "$ tarih: Güncellendi" >> /home/user/logs/test.log
    echo «——————————————-» >> /home/user/logs/test.log
    fi

    Teorik olarak iyi olmalı, ancak gerçek şu ki, başvurulan dosya zaten mevcutsa güncellenmez.

    1.    çevik dijo

      pardon gönderilmediğini gördüm ve ikiye katlanmış