Bash: Điều kiện (if-then-else)

Xin chào

Lần này tôi sẽ chỉ cho bạn cách tạo một kịch bản với điều kiện Cú đánh, được dịch là:

Nếu điều X bạn muốn được hoàn thành, hành động Y được thực hiện, nếu điều đó không được hoàn thành thì hành động khác được thực hiện.

Giải thích đơn giản không 😀

Bây giờ, tôi đã suy nghĩ trong vài phút về một số ví dụ để sử dụng trong hướng dẫn này, tình huống tiến thoái lưỡng nan / vấn đề / tình huống sau đã xảy ra với tôi:

Chúng tôi đang sử dụng mạng của công ty chúng tôi và chúng tôi muốn biết máy tính X có được kết nối với mạng hay không. Đối với điều này, chúng tôi thực hiện một kịch bản anh ta sẽ làm gì ping đối với máy tính đó và nếu nó nằm trên mạng (nghĩa là, nếu nó trả về ping) sẽ cho chúng ta biết rằng CÓ, nó đang ở trên mạng, nếu không (nghĩa là nó không có trên mạng) nó sẽ cho chúng ta biết rằng nó KHÔNG có trên mạng.

Khi điều này được thực hiện, bây giờ tôi sẽ giải thích cách quay vòng với các điều kiện 🙂

Đây là mã:

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

Đừng lo lắng, tôi sẽ giải thích chi tiết điều này cho bạn 😉

ping là lệnh chúng ta sẽ sử dụng và nó sẽ cho chúng ta biết PC đó có trên mạng hay không. Để biết PC nào chúng ta muốn kiểm tra xem nó có trên mạng hay không, chúng ta phải thay đổi ĐỊA CHỈ IP rõ ràng là địa chỉ IP của PC mà chúng tôi muốn kiểm tra.

Như bạn thấy, tôi đặt «-c 1«, Điều cần thiết đối với chúng tôi. Khi chúng ta ping một máy tính, hành động này sẽ không dừng lại (ping) cho đến khi chúng ta tự nhấn [Ctrl] + [C], vì vậy đặt «-c 1»Chúng tôi yêu cầu bạn chỉ thực hiện một xác minh (chỉ một lần ping) và không xác minh nào khác, điều này sẽ khiến nó dừng ngay lập tức, tức là… nó sẽ kiểm tra xem máy tính có vào mạng chỉ một lần hay không.

Nếu bạn nghi ngờ về điều này, không đau ... họ nói như vậy và tôi sẽ sẵn lòng giải thích lại cho họ 😉

Bây giờ đến chu kỳ, bởi vì những gì tôi vừa giải thích không gì khác hơn là một lệnh / hành động bình thường 😀

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

Để bạn hiểu điều này, tôi sẽ giải thích một chi tiết cực kỳ quan trọng của Bash 🙂

Người am hiểu nhất về chủ đề này có thể cho tôi là sai hoặc đại loại như vậy, nhưng này, tôi viết bài này cho những người mới làm quen hoặc ít chuyên gia hơn, miễn là họ hiểu thì tuyệt vời 😉

Nó xảy ra như trong Cú đánh nó giống như 0 y 1, tức là bạn còn sống hoặc bạn đã chết, khi một lệnh hoặc hành động được thực thi: thực hiện tốt Không vấn đề gì (1), Hoặc có một số vấn đề hoặc lôi (0).

Chúng tôi thực hiện hành động hoặc lệnh X, và những gì chúng tôi đã làm có thể được thực hiện tốt hoặc không tốt, nó có thể có lỗi hoặc không, và đây là nơi chi tiết

Nếu những gì chúng tôi gửi để làm (trong trường hợp này: ping -c 1 IP-ĐỊA CHỈ) không đưa ra lỗi và nó đã thành công, vì vậy nó sẽ trả về giá trị: 1 . Ngược lại, và nếu hành động (tức là ping) không thành công, nó sẽ trả về giá trị 0.

 Và cuối cùng, đoạn mã trên có nghĩa là:

Nếu giá trị 0 được trả về thì

Hiển thị văn bản: «Không có trên mạng»

Nếu không (và trả về KHÔNG phải 0, mà là 1)

Hiển thị văn bản: «Nếu nó ở trong mạng«

Điều này mà tôi vừa giải thích với bạn, sẽ giúp ích cho chúng ta trong tương lai vì nhiều điều thực sự hữu ích khi có thể nói rằng nếu hành động X mắc lỗi, hãy thực hiện hành động Y và trong trường hợp hành động X không đưa ra lỗi lỗi, sau đó thực hiện hành động Z.

Tôi biết rằng một số người có thể hơi liên quan, vì vậy tôi đã cố gắng giải thích nó theo nhiều cách khác nhau, cố gắng làm cho mọi người hiểu theo cách này hay cách khác. Trong trường hợp có ai còn nghi ngờ, hãy cho tôi biết.

Bây giờ, chúng ta hãy tạo kịch bản của chúng ta 😀

Chúng ta phải làm theo các bước trong hướng dẫn này: Bash: Cách tạo một tập lệnh thực thi

Sau đó, hãy sao chép mã sau vào tệp đó (tập lệnh.sh), và cuối cùng, hãy nói «ra»(Không có dấu ngoặc kép):

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

Nó sẽ trông như thế này (hãy nhớ rằng họ phải thay đổi IP-ADDRESS thành IP họ muốn):

Ở đây bạn có thể thấy tập lệnh đang chạy:

% CODE1%

Như bạn có thể thấy, cuối cùng anh ấy nói với chúng ta «Có nó trong mạng»🙂

Điều quan trọng ở đây là họ thực sự hiểu điều này của các điều kiện, vì vậy tôi để lại cho bạn một mã khác để giải thích lại nó, nhưng từ một quan điểm khác.

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

Điều này có nghĩa là đơn giản, tôi để lại giải thích từng dòng:

Dòng đầu tiên: Những gì chúng tôi viết, đó sẽ là giá trị của biến «văn bản»(Không có dấu ngoặc kép).

Dòng thứ 2: Kiểm tra xem nội dung của biến (những gì chúng tôi vừa viết) là 3.

Dòng đầu tiên: Trong trường hợp được 3, nó sẽ hiển thị cho chúng ta văn bản «Đúng»(Không có dấu ngoặc kép).

Dòng thứ 4: Ngược lại (nghĩa là trong trường hợp chúng tôi chưa viết 3).

Dòng thứ 5: Nó sẽ hiển thị cho chúng ta văn bản «Sai»(Không có dấu ngoặc kép).

Dòng thứ 6: Điều kiện kết thúc.

Như họ đã có thể nhận ra, nếu chúng ta đặt bỏ lỡ và sau đó giữa dấu ngoặc kép («) một văn bản, điều này sẽ làm cho văn bản đó được hiển thị trong thiết bị đầu cuối. Đó là, nếu chúng ta đặt:

echo "esto es una prueba"

Nó sẽ hiển thị cho chúng ta văn bản trong thiết bị đầu cuối: đây là một bài kiểm tra

Nhưng quay lại ví dụ thứ hai này, tôi sẽ cho bạn thấy sự hữu ích (và khả năng thực thi) của tập lệnh thứ hai này với một thứ RẤT đơn giản 😀… điển hình «1 + 2 là bao nhiêu?«

Tôi để lại mã của tập lệnh hoàn chỉnh:

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

Đây là cách tập lệnh hoạt động:

% CODE2%

Và cũng ... không có gì thêm.

Đây là một cái gì đó cơ bản, đơn giản là có, nhưng tôi vẫn cố gắng giải thích nó tốt nhất có thể, bởi vì không phải ai cũng có tâm hồn của một lập trình viên, và nhiều khi chúng ta cần phải tạo các tập lệnh như thế này (hoặc tương tự), trong mọi trường hợp. hy vọng bài viết này sẽ hữu ích cho bạn ai đó 🙂

Bất kỳ nghi ngờ hoặc câu hỏi, khiếu nại hoặc đề nghị, vui lòng để lại ở đây, tôi sẽ sẵn lòng trả lời bạn và do đó, chúng ta cùng tìm hiểu thêm một chút 😀

Liên quan


26 bình luận, để lại của bạn

Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: Miguel Ángel Gatón
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.

  1.   jhals dijo

    Bạn là một người chuyên nghiệp !!! *hoặc là*

    1.    KZKG ^ Gaara dijo

      Không có gì đâu 😀
      Nếu nó phục vụ bạn và nó là thú vị, tôi hài lòng 😉

      Chào bạn

  2.   đúng dijo

    @ KZKG ^ Gaara,
    nói về lập trình bash tôi có một câu hỏi:
    Sự khác biệt giữa việc khai báo một biến như VAR = hello và khai báo nó như thế này VAR = $ {VAR: -hello} là gì?

    Tôi giải thích:
    http://pastebin.com/a3cfWXeD

    lời chào 😉

    1.    KZKG ^ Gaara dijo

      Xin chào
      Chà, tôi không phải là một chuyên gia về bash chút nào ... thực ra, tôi không biết LOL !!
      Khi tôi khai báo các biến, nó như thế này:
      : ${OPTFOLDER:="/opt/"}

      Nhưng bởi vì tôi luôn làm như vậy, tôi không biết sự khác biệt có thể thành thật là gì 🙁

  3.   đúng dijo

    @ KZKG ^ Gaara
    Tôi đã đặt câu hỏi vì sự thật là tôi cũng không biết, tôi thường viết SlackBuilds và sự thật là các biến được khai báo như trong VAR1 có rất nhiều trong các tập lệnh này. Tìm kiếm nhanh trên google đã giúp tôi làm rõ câu hỏi này, tôi chia sẻ nó với mọi người để tất cả chúng ta cùng tìm hiểu:

    Kịch bản:
    http://pastebin.com/faAQb35w

    Giải trình:
    Khai báo các biến có dạng VAR = $ {VAR: -default_value} có nghĩa là biến VAR sẽ nhận giá trị default_value nếu và chỉ khi giá trị là null hoặc không tồn tại.

    Ví dụ thực tế:
    Khi thực thi tập lệnh, nó được yêu cầu nhập một giá trị được lưu trữ trong biến VAR, nếu một cái gì đó được nhập vào, nó sẽ hiển thị những gì đã được nhập. Nếu chúng ta không nhập bất cứ thứ gì và nhấn enter, chúng ta đang khai báo biến VAR là null, do đó nó hiển thị value_default.

    Chúc mừng.

    1.    KZKG ^ Gaara dijo

      HAHA Tôi không biết điều đó 😀
      Ok, cảm ơn bạn rất nhiều ... đó là ý của tôi ở cuối bài viết, tôi không có ý định dạy một cái gì đó và chỉ có thế, tôi biết rằng tôi sẽ luôn học được những điều mới ở đây 😀

      Xin chào và cảm ơn một lần nữa.

      1.    đúng dijo

        bạn nói đúng, người ta học được nhiều điều ở đây.

        lời chào và ngày lễ vui vẻ !! 😀

  4.   Lucas Matthias dijo

    +1 tuyệt vời và được giải thích một cách xuất sắc, thời gian mà bạn sẽ mất ...
    nhưng tôi đáng để nỗ lực 😉

    1.    KZKG ^ Gaara dijo

      Tôi thực sự đã viết được 80% chỉ trong 1 ngày, tôi đã mất quá nhiều thời gian để đăng nó chỉ vì internet của tôi không cho phép tôi.
      Cảm ơn bạn đã bình luận 😉

  5.   Hugo dijo

    Một cách khác để làm điều đó là sử dụng DNS, vì đôi khi các mạng bị chặn giao thức ICMP:

    (host -ta IP-ADDRESS> / dev / null 2> & 1) && echo "Đã kết nối với mạng"

    Bạn cũng sẽ nhận thấy rằng trong ví dụ này, việc kiểm tra giá trị trả về là ẩn 😉

    1.    KZKG ^ Gaara dijo

      Bạn vẫn luôn là bạn, với những mẹo mà tôi hoàn toàn không biết HAHAHA.
      Cảm ơn bạn, nhận xét được đánh giá cao và hehe ... một điều mới mà tôi học được 😀

  6.   Ngày dijo

    Cảm ơn

    ????

  7.   Leper_Ivan dijo

    Mặc dù đã vài ngày trôi qua kể từ khi xuất bản chủ đề này, nó đã giúp ích cho tôi rất nhiều, bây giờ tôi đã thực hiện một kịch bản trong bash .. Cảm ơn Gaara ..

  8.   Edgar navarro dijo

    Tiến sĩ. Cảm ơn sự giúp đỡ mà bạn đã làm rõ mọi thứ cho tôi.

    Chỉ là một truy vấn, tôi phải làm như thế nào để khi một máy tính ngừng ping tự động thì máy kia sẽ thay đổi IP. Tôi có cái này.

    để thay đổi IP
    #! / bin / bash
    ping -c 10 192.168.1.50 # Nếu nó không tự động ping
    ifconfig eth0 192.168.1.50 mặt nạ mạng 255.255.255.0 phát sóng 192.168.1.0
    ifconfig eth0 xuống
    ifconfig eth0 lên

  9.   Abraham dijo

    vì khi so sánh với if bạn dùng dấu chấm hỏi? có gì khác biệt giữa việc đặt? bất kỳ lá thư nào khác

    1.    KZKG ^ Gaara dijo

      $? có nghĩa là 'đầu ra hoặc đầu ra trước đó', nghĩa là, trong trường hợp kết quả của lệnh trước đó ... 🙂

      1.    Andrew dijo

        Có một cách khác để đạt được kết quả tương tự, truyền trực tiếp lệnh ping làm đối số cho if:

        nếu ping -c 1 IP-ADDRESS; sau đó
        echo "Vâng, nó có trên mạng"
        khác
        echo "Không có trên mạng"
        fi

        Điều xảy ra là nếu đánh giá giá trị trả về của lệnh mà bạn truyền vào làm đối số, nếu nó trả về 0 thì nó là true, bất kỳ thứ gì khác là false. Dấu ngoặc vuông tương đương với lệnh kiểm tra. Nhưng bạn có thể chuyển bất kỳ lệnh nào dưới dạng đối số (miễn là lệnh trả về giá trị nào đó).

  10.   Liên quan dijo

    Xin chào, làm cách nào để thực thi script.sh với người dùng X trong tập lệnh Tôi tạo người dùng Y và người dùng Y đó tiếp tục thực thi script.sh

    Điều này có thể được thực hiện ??

  11.   kuktos dijo

    Rất thú vị, cảm ơn!

  12.   Francisco dijo

    Cảm ơn vì đã đóng góp, tôi đã mất cả tiếng đồng hồ để hiểu nó xD, nhưng tôi đã hiểu nó !!!!.

  13.   eloy dijo

    Kịch bản ổn. Về mặt số học, nó cũng có thể được thực hiện là ($? == 0) nếu nó bằng XNUMX thì nó không có trên mạng, nếu không thì nó ở trên mạng. Và nếu chúng tôi vẫn muốn làm cho nó tương tác hơn một chút, chúng tôi có thể nói:
    echo -n Nhập IP:
    đọc ip
    ping -c 1 $ ip

  14.   Dario dijo

    Xin chào, tôi rất mới làm quen với điều này, tôi đang cố gắng tạo một số vé (chữ và số) thông qua một lần đọc và tôi muốn rằng nếu những gì được nhập có định dạng chính xác (ABC-123456) sẽ thực hiện lệnh "x" và tôi không biết phải làm như thế nào, bạn có thể giúp tôi?

    echo "Nhập vé"
    vé read -p

    if $ ticket = "no idea (format ABC-123456"); sau đó cp file.txt $ vé; else echo "định dạng sai, thử lại"; đọc -p; fi.

    Chắc chắn điều đó thật kinh khủng và họ cười haha, nhưng như tôi đã nói, tôi chỉ mới bắt đầu với việc này.

    Nếu tôi giải thích không tốt xin vui lòng cho tôi biết và tôi cố gắng làm tốt hơn.

    Ôm tất cả mọi người.

  15.   Umberto Y dijo

    Lời giải thích tuyệt vời, lời chào

  16.   nhanh nhẹn dijo

    Tôi có một chút nghi ngờ với if, else và những thứ khác.
    Tôi muốn một tập lệnh để kiểm tra xem một tệp có tồn tại hay không (một trong các bản ghi) và nếu không, hãy tạo nó và sau đó ghi vào nó. Nhưng nếu nó tồn tại, tôi muốn bạn chỉ cần viết thư cho nó.

    Những gì tôi có là:

    date = `date -R`
    # Tôi đang thử nghiệm ngày có thể thay đổi, ngày này không cập nhật cho tôi từ khi bắt đầu
    # quy trình và kết thúc, đôi khi một giờ có thể trôi qua và thời gian chính xác không xuất hiện.

    if [-f /home/user/logs/test.log];
    sau đó
    chạm vào /home/usuario/logs/test.log
    khác
    echo "$ date: Đã cập nhật" >> /home/user/logs/test.log
    echo «———————————————-» >> /home/user/logs/test.log
    fi

    Về lý thuyết thì nó sẽ ổn, nhưng thực tế là nó không được cập nhật nếu tệp được tham chiếu đã tồn tại

    1.    nhanh nhẹn dijo

      xin lỗi, tôi thấy rằng nó chưa được gửi và nó đã tăng gấp đôi