重擊:條件(如果-則-否則)

你好

這次,我將向您展示如何製作帶有條件的腳本 巴什,翻譯為:

如果完成了所需的X項操作,則完成了Y動作,如果未完成,則完成另一項操作。

簡單的解釋不😀

現在,我已經想了幾分鐘關於本教程中要使用的示例,我遇到了以下難題/問題/情況:

我們在公司的網絡上,我們想知道X計算機是否已連接到網絡。 為此,我們做一個 腳本 他會怎麼做 到該計算機,以及該計算機是否在網絡上(即,如果該計算機返回 )會告訴我們是,它在網絡上,否則(也就是說,它不在網絡上)它將告訴我們它不在網絡上。

一旦完成,現在我將解釋如何在條件conditions下循環

這是代碼:

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

別擔心,我會詳細向您解釋😉

是我們將使用的命令,它將告訴我們該PC是否在網絡上。 為了告訴您我們要檢查哪個PC是否在網絡上,我們必須更改 IP地址 顯然是我們要檢查的PC的IP地址。

如您所見,我把«-c 1«,這對我們來說是必需的。 當我們對計算機執行ping操作時,直到我們按一下自己,該操作才會停止(ping) [Ctrl] + [C],因此放置«-c 1»我們告訴您僅進行一次驗證(僅一次ping嘗試),而不會進行其他驗證,這將使其立即停止,即…它將僅檢查計算機是否在網絡上一次。

如果您對此有疑問,請別擔心...他們這麼說,我很樂意再次向您解釋😉

現在輪到這個週期了,因為我剛才解釋的只是普通的命令/動作😀

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

為了讓您理解這一點,我將解釋Bash的一個非常重要的細節

最了解該主題的人可能會稱我為錯誤或類似的東西,但是,嘿,我為新手或更少的專家寫這篇文章,只要他們理解然後很棒。

碰巧像 巴什 就像 0 y 1,即執行命令或動作時您是活著還是死了: 執行得很好 沒問題 (1),或 有一些 問題或 error (0).

我們執行X動作或命令,而我們所做的可能好壞,可能有錯誤,這是細節所在😉

如果我們發送要執行的操作(在這種情況下: ping -c 1 IP地址)沒有給出錯誤並成功執行,因此它將返回值: 1 。 否則,如果操作(即ping)未成功,它將返回值 0.

 最後,以上代碼是什麼意思:

如果返回值0,則

顯示文字:«不在網絡上»

否則(並返回NOT 0,但返回1)

顯示文字:«如果在網絡中«

我剛剛向您解釋的這一點將來會在很多事情上為我們服務,因為可以說如果X動作出錯了,則執行Y動作,如果X動作沒有給出錯誤,那麼讓Z動作非常有用。

我知道有些人可能會參與其中,所以我試圖以幾種不同的方式來解釋它,試圖使每個人都以一種或另一種方式來理解它。 如果有人有任何疑問,請告訴我。

現在,讓我們編寫腳本😀

我們必須遵循本教程中的步驟: Bash:如何製作可執行腳本

然後,將以下代碼複製到該文件中(腳本文件),最後我們說«出口»(不帶引號):

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

它應該看起來像這樣(記住,您必須將IP地址更改為所需的IP):

在這裡,您可以看到正在運行的腳本:

%CODE1%

如您所見,他最後告訴我們«是的,它在網絡中»🙂

這裡重要的是,他們實際上了解這些條件,因此,我從另一個角度為您提供了另一個代碼來再次解釋它。

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

這意味著簡單,我逐行留下說明:

第一行: 我們寫的就是變量«文本»(不帶引號)。

第二行: 檢查變量的內容(我們剛才寫的內容)是否為 3.

第一行: 如果被 3,它將向我們顯示文本«更正»(不帶引號)。

第四行: 否則(也就是說,如果我們沒有寫3)。

第四行: 它將向我們顯示文本«不正確的»(不帶引號)。

第四行: 條件結束。

他們已經意識到,如果我們把 錯過 然後在雙引號(«)文本,這將導致該文本顯示在終端中。 也就是說,如果我們輸入:

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

腳本的工作方式如下:

%CODE2%

好吧...僅此而已。

這是基本的,很簡單,是的,但是我仍然嘗試著盡可能地解釋它,因為並不是每個人都擁有程序員的靈魂,而且很多時候我們需要製作類似(或類似)的腳本,無論如何我希望本文對您有用。有人🙂

如有任何疑問或疑問,投訴或建議,請留在這裡,我會很樂意回答您,因此,我們都學到了更多的知識😀

問候


26條評論,留下您的評論

發表您的評論

您的電子郵件地址將不會被發表。 必填字段標有 *

*

*

  1. 負責數據:MiguelÁngelGatón
  2. 數據用途:控制垃圾郵件,註釋管理。
  3. 合法性:您的同意
  4. 數據通訊:除非有法律義務,否則不會將數據傳達給第三方。
  5. 數據存儲:Occentus Networks(EU)託管的數據庫
  6. 權利:您可以隨時限制,恢復和刪除您的信息。

  1.   賈爾斯 他說:

    你是專業人士! *要么*

    1.    KZKG ^ Gaara 他說:

      沒事的😀
      如果它對您有用並且很有趣,我會滿意😉

      問候朋友

  2.   正確 他說:

    @ KZKG ^ Gaara,
    說到bash編程,我有一個問題:
    像這樣聲明變量VAR = hello和像這樣聲明變量VAR = $ {VAR:-hello}有什麼區別?

    我解釋:
    http://pastebin.com/a3cfWXeD

    問候😉

    1.    KZKG ^ Gaara 他說:

      你好
      好吧,我根本不是bash方面的專家...實際上,我不知道哈哈!
      當我聲明變量時,它是這樣的:
      : ${OPTFOLDER:="/opt/"}

      但是因為我一直這樣做,所以我真的不知道會有什麼區別🙁

  3.   正確 他說:

    @ KZKG ^加拉拉
    好吧,我問了這個問題,因為事實是我也不知道,我通常寫SlackBuilds,事實是在這些腳本中有很多在VAR1中聲明的變量。 快速的Google搜索幫助我澄清了這個問題,我與所有人分享了這一點,以便我們所有人都可以學習:

    腳本:
    http://pastebin.com/faAQb35w

    說明:
    以VAR = $ {VAR:-default_value}的形式聲明變量意味著變量VAR將在且僅當該值為null或不存在時採用值default_value。

    實際示例:
    執行腳本時,要求輸入要存儲在VAR變量中的值,如果輸入了內容,它將顯示輸入的內容。 如果不輸入任何內容,然後按Enter鍵,則將變量VAR聲明為null,因此它顯示default_value。

    問候。

    1.    KZKG ^ Gaara 他說:

      哈哈我不知道😀
      好的,非常感謝您的朋友……這就是我在本文結尾處的意思,我無意教一些東西,僅此而已,我知道我將永遠在這裡學到一些新東西😀

      問候和再次感謝。

      1.    正確 他說:

        沒錯,這裡有人學到了幾件事。

        問候和節日快樂! 😀

  4.   盧卡斯·馬蒂亞斯(Lucas Matias) 他說:

    很棒,而且講得很好+1,這將花費您時間...
    但是我值得努力

    1.    KZKG ^ Gaara 他說:

      實際上,我在短短80天內就寫了1%的文章,之所以花很長時間才發布,只是因為我的互聯網不允許我這樣做。
      謝謝你的評論😉

  5.   雨果 他說:

    另一種方法是使用DNS,因為有時網絡會阻止ICMP協議:

    (主機-ta IP地址> / dev / null 2>&1)&&回顯“已連接到網絡”

    您還將注意到,在此示例中,返回值檢查是隱式的😉

    1.    KZKG ^ Gaara 他說:

      您一如既往地以我不完全知道的小竅門哈哈哈。
      謝謝您的評論,我們非常感激,呵呵...我學到的另一件事

  6.   達圖克斯 他說:

    謝謝

    🙂

  7.   麻風病人 他說:

    儘管自從本主題發布以來已經過了幾天,但由於我用bash編寫了腳本,因此它對我有很大幫助。。謝謝Gaara ..

  8.   埃德加·納瓦羅 他說:

    Doc。謝謝您的幫助,讓我明白了。

    只是一個查詢,當一台計算機停止自動ping其他計算機時,我將如何更改IP。 我有這個。

    更改IP
    #!/斌/慶典
    ping -c 10 192.168.1.50#如果沒有自動ping
    ifconfig eth0 192.168.1.50網絡掩碼255.255.255.0廣播192.168.1.0
    ifconfig eth0關閉
    ifconfig eth0向上

  9.   亞伯拉罕 他說:

    因為與之比較時是否使用問號? 放之間有什麼區別? 任何其他字母

    1.    KZKG ^ Gaara 他說:

      $? 表示“先前的輸出或輸出”,即在先前命令的結果的情況下...🙂

      1.    安德魯 他說:

        還有另一種方法可以達到相同的結果,將ping命令直接作為參數傳遞給if:

        如果ping -c 1 IP地址; 然後
        迴聲“是的,它在網上”
        其他
        回顯“不在網絡上”
        fi

        發生的情況是,如果計算作為參數傳遞的命令的返回值,則返回0,則返回true,否則返回false。 方括號等效於測試命令。 但是您可以將任何命令作為參數傳遞(只要命令返回一些值)。

  10.   問候 他說:

    您好,如何在腳本中與用戶X一起執行script.sh,我創建了用戶Y,並且該用戶Y繼續執行script.sh

    能做到嗎?

  11.   庫克托斯 他說:

    非常有趣,謝謝!

  12.   舊金山 他說:

    感謝您的貢獻,我已經花了一個小時來了解xD,但是我了解它!

  13.   埃洛伊 他說:

    該腳本很好。 如果等於零,則算術上也可以用($?== 0)表示,它不在網絡上,否則在網絡上。 如果我們仍然想使其更具交互性,我們可以說:
    echo -n輸入IP:
    讀ip
    ping -c 1 $ ip

  14.   達里奧 他說:

    您好,我對此很陌生,我試圖通過讀取來生成票證編號(字母數字),並且我希望如果輸入的內容具有正確的格式(ABC-123456),請執行“ x”命令而且我不知道該怎麼辦,您能幫我嗎?

    迴聲“輸入票”
    讀-p票

    如果$ ticket =“不知道(格式ABC-123456”); 然後cp file.txt $ ticket; 否則回顯“格式錯誤,請重試”; 讀-p; fi。

    當然這太可怕了,他們笑哈哈,但是就像我說的那樣,我才剛剛開始。

    如果我解釋不好,請告訴我,我會嘗試做得更好。

    擁抱大家。

  15.   亨伯托·Y 他說:

    很好的解釋,問候

  16.   敏捷 他說:

    我對 if、else 和其他人有點懷疑。
    我想要一個腳本來檢查文件是否存在(日誌之一),如果不存在,則創建它並稍後寫入它。 但如果它存在,我希望你寫信給它。

    我所擁有的是:

    日期 = `日期 -R`
    #我正在測試變量日期,它不會在開始之間更新
    #process並結束,有時一個小時過去了,正確的時間沒有出來。

    如果 [-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.    敏捷 他說:

      對不起,我看到它沒有發送,它已經翻了一番