Bash: เงื่อนไข (if-then-else)

สวัสดี

คราวนี้ฉันจะแสดงวิธีสร้างสคริปต์ที่มีเงื่อนไขใน ทุบตีซึ่งแปลคือ:

หากสิ่งที่คุณต้องการ X สำเร็จการดำเนินการ Y จะเสร็จสิ้นหากไม่สำเร็จการดำเนินการอื่นจะเสร็จสิ้น

คำอธิบายง่ายๆไม่😀

ตอนนี้ฉันได้คิดสักสองสามนาทีเกี่ยวกับตัวอย่างที่จะใช้ในบทช่วยสอนนี้ปัญหา / ปัญหา / สถานการณ์ต่อไปนี้เกิดขึ้นกับฉัน:

เราอยู่ในเครือข่ายของ บริษัท ของเราและเราต้องการทราบว่าคอมพิวเตอร์ X เชื่อมต่อกับเครือข่ายหรือไม่ สำหรับสิ่งนี้เราสร้างไฟล์ ต้นฉบับ เขาจะทำอะไร ปิง ไปยังคอมพิวเตอร์เครื่องนั้นและหากอยู่ในเครือข่าย (นั่นคือถ้าส่งคืนไฟล์ ปิง) จะบอกเราว่าใช่มันอยู่บนเครือข่ายมิฉะนั้น (นั่นคือมันไม่ได้อยู่บนเครือข่าย) มันจะบอกเราว่ามันไม่ได้อยู่ในเครือข่าย

เมื่อเสร็จแล้วตอนนี้ฉันจะอธิบายวิธีการวนรอบด้วยเงื่อนไข🙂

นี่คือรหัส:

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

ไม่ต้องกังวลฉันจะอธิบายรายละเอียดให้ฟัง😉

ปิง เป็นคำสั่งที่เราจะใช้และจะบอกเราว่าพีซีเครื่องนั้นอยู่ในเครือข่ายหรือไม่ ในการบอกคุณว่าพีซีเครื่องใดที่เราต้องการตรวจสอบว่าอยู่ในเครือข่ายหรือไม่เราต้องเปลี่ยน ที่อยู่ IP เห็นได้ชัดว่าที่อยู่ IP ของพีซีที่เราต้องการตรวจสอบ

อย่างที่คุณเห็นฉันใส่«-ค 1«ซึ่งจำเป็นสำหรับเรา เมื่อเรา ping คอมพิวเตอร์การกระทำนี้จะไม่หยุด (ping) จนกว่าเราจะกดเอง [Ctrl] + [C]ดังนั้นการวาง«-ค 1»เราขอแจ้งให้คุณทำการตรวจสอบเพียงครั้งเดียว (การ ping เพียงครั้งเดียว) และไม่ต้องดำเนินการใด ๆ สิ่งนี้จะทำให้หยุดทันทีนั่นคือ ... จะตรวจสอบว่าคอมพิวเตอร์อยู่ในเครือข่ายเพียงครั้งเดียวหรือไม่

หากคุณมีข้อสงสัยเกี่ยวกับเรื่องนี้ไม่ต้องเจ็บปวด ... พวกเขาพูดอย่างนั้นและฉันยินดีที่จะอธิบายให้คุณฟังอีกครั้ง😉

ตอนนี้มาถึงวัฏจักรแล้วเพราะสิ่งที่ฉันเพิ่งอธิบายไปนั้นไม่มีอะไรมากไปกว่าคำสั่ง / การกระทำปกติ😀

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

เพื่อให้คุณเข้าใจสิ่งนี้ฉันจะอธิบายรายละเอียดที่สำคัญอย่างยิ่งของ Bash 🙂

ผู้ที่มีความรู้มากที่สุดในเรื่องนี้อาจตราหน้าว่าฉันผิดหรืออะไรทำนองนั้น แต่เดี๋ยวก่อนฉันเขียนสิ่งนี้สำหรับมือใหม่หรือผู้เชี่ยวชาญน้อยกว่าตราบเท่าที่พวกเขาเข้าใจเรื่องนี้ก็เป็นเรื่องที่ดี

มันเกิดขึ้นเช่นเดียวกับใน ทุบตี มันเป็นอย่างนั้น 0 y 1นั่นคือไม่ว่าคุณจะมีชีวิตอยู่หรือคุณตายไปแล้วเมื่อมีการดำเนินการคำสั่งหรือการกระทำ: อย่างใดอย่างหนึ่ง ดำเนินการได้ดี ไม่มีปัญหา (1) หรือ มีบางอย่าง ปัญหาหรือ ความผิดพลาด (0).

เราดำเนินการ X Action หรือคำสั่งและสิ่งที่เราทำอาจดำเนินไปด้วยดีหรือไม่ดีอาจมีข้อผิดพลาดหรือไม่และนี่คือที่มาของรายละเอียด😉

หากสิ่งที่เราส่งไปทำ (ในกรณีนี้: ping -c 1 IP-ADDRESS) ไม่ได้ให้ข้อผิดพลาดและประสบความสำเร็จดังนั้นมันจะคืนค่า: 1 . มิฉะนั้นและหากการดำเนินการ (นั่นคือ ping) ไม่สำเร็จจะส่งคืนค่า 0.

 และในที่สุดความหมายของรหัสข้างต้นก็คือ:

หากส่งคืนค่า 0 แล้ว

แสดงข้อความ: «ไม่ได้อยู่ในเครือข่าย»

มิฉะนั้น (และกลับไม่ใช่ 0 แต่ 1)

แสดงข้อความ: «หากอยู่ในเครือข่าย«

สิ่งนี้ที่ฉันเพิ่งอธิบายให้คุณฟังจะให้บริการเราในอนาคตสำหรับหลาย ๆ สิ่งเพราะมันมีประโยชน์มากที่จะสามารถพูดได้ว่าหากการกระทำ X เกิดข้อผิดพลาดให้ทำการกระทำ Y และในกรณีที่การกระทำ X ไม่ได้ให้ ข้อผิดพลาดจากนั้นให้ดำเนินการ Z

ฉันรู้ว่าบางคนอาจมีส่วนเกี่ยวข้องเล็กน้อยดังนั้นฉันจึงพยายามอธิบายด้วยวิธีต่างๆมากมายพยายามทำให้ทุกคนเข้าใจไม่ทางใดก็ทางหนึ่ง ในกรณีที่มีใครสงสัยโปรดแจ้งให้เราทราบ

ตอนนี้ขอสร้างสคริปต์ของเรา😀

เราต้องทำตามขั้นตอนในบทช่วยสอนนี้: Bash: วิธีสร้างสคริปต์ปฏิบัติการ

จากนั้นให้คัดลอกโค้ดต่อไปนี้ลงในไฟล์ (script.sh) และในตอนท้ายสมมติว่า«ทางออก» (ไม่มีเครื่องหมายคำพูด):

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

ควรมีลักษณะดังนี้ (จำไว้ว่าคุณต้องเปลี่ยน IP-ADDRESS เป็น IP ที่คุณต้องการ):

คุณสามารถดูสคริปต์ที่กำลังทำงานอยู่ที่นี่:

% CODE1%

อย่างที่คุณเห็นในท้ายที่สุดเขาก็บอกเราว่า«ใช่มันอยู่ในเครือข่าย»🙂

สิ่งสำคัญที่นี่คือพวกเขาเข้าใจเงื่อนไขนี้จริงๆดังนั้นฉันจึงปล่อยรหัสอื่นให้คุณอธิบายอีกครั้ง แต่จากมุมมองอื่น

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

สิ่งนี้หมายความว่าง่ายฉันปล่อยให้คำอธิบายทีละบรรทัด:

บรรทัดที่ 1: สิ่งที่เราเขียนนั่นจะเป็นค่าของตัวแปร«ข้อความ» (ไม่มีเครื่องหมายคำพูด)

บรรทัดที่ 2: ตรวจสอบว่าเนื้อหาของตัวแปร (สิ่งที่เราเพิ่งเขียน) คืออะไร 3.

บรรทัดที่ 3: ในกรณีที่เป็น 3มันจะแสดงให้เราเห็นข้อความ«แก้ไข» (ไม่มีเครื่องหมายคำพูด)

บรรทัดที่ 4: มิฉะนั้น (นั่นคือในกรณีที่เราไม่ได้เขียน 3)

บรรทัดที่ 5: มันจะแสดงข้อความ«ไม่ถูกต้อง» (ไม่มีเครื่องหมายคำพูด)

บรรทัดที่ 6: สิ้นสุดเงื่อนไข

พวกเขาจะรู้ได้อย่างไรว่าเราใส่ เสียงสะท้อน แล้วระหว่างเครื่องหมายคำพูดคู่ («) ข้อความซึ่งจะทำให้ข้อความนั้นแสดงในเทอร์มินัล นั่นคือถ้าเราใส่:

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%

และดี ... ไม่มีอะไรจะเพิ่มอีกแล้ว

นี่เป็นสิ่งพื้นฐานง่ายใช่ แต่ฉันก็ยังพยายามอธิบายให้ดีที่สุดเพราะไม่ใช่ทุกคนที่มีจิตวิญญาณของโปรแกรมเมอร์และหลายครั้งเราจำเป็นต้องสร้างสคริปต์เช่นนี้ (หรือคล้ายกัน) ไม่ว่าในกรณีใดก็ตามฉัน หวังว่าบทความนี้จะเป็นประโยชน์กับคุณใครบางคน🙂

มีข้อสงสัยหรือคำถามข้อร้องเรียนหรือข้อเสนอแนะโปรดทิ้งไว้ที่นี่เรายินดีที่จะตอบคุณดังนั้นเราทุกคนจะได้เรียนรู้เพิ่มเติมอีกเล็กน้อย😀

ความนับถือ


แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. ผู้รับผิดชอบข้อมูล: Miguel ÁngelGatón
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา

  1.   จาลส์ dijo

    คุณคือมือโปร !!! *หรือ*

    1.    KZKG ^ กาอาระ dijo

      ไม่มีอะไรเลย😀
      ถ้ามันให้บริการคุณและน่าสนใจฉันก็พอใจ😉

      ทักทายเพื่อน

  2.   เหมาะสม dijo

    @ KZKG ^ กาอาระ
    เมื่อพูดถึงการเขียนโปรแกรม bash ฉันมีคำถาม:
    อะไรคือความแตกต่างระหว่างการประกาศตัวแปรเช่น VAR = hello นี้และการประกาศเช่นนี้ VAR = $ {VAR: -hello}

    ฉันอธิบาย:
    http://pastebin.com/a3cfWXeD

    ทักทาย😉

    1.    KZKG ^ กาอาระ dijo

      สวัสดี
      ฉันไม่ได้เชี่ยวชาญเรื่องการทุบตีเลย ... ที่จริงฉันไม่รู้เลยล่ะ !!
      เมื่อฉันประกาศตัวแปรมันเป็นดังนี้:
      : ${OPTFOLDER:="/opt/"}

      แต่เพราะฉันทำแบบนี้มาตลอดฉันจึงไม่รู้ว่าความแตกต่างนั้นจะเป็นอย่างไร🙁

  3.   เหมาะสม dijo

    @ KZKG ^ กาอาระ
    ฉันถามคำถามนี้เพราะความจริงก็คือฉันไม่รู้เหมือนกันฉันมักจะเขียน SlackBuilds และความจริงก็คือตัวแปรที่ประกาศใน VAR1 นั้นมีอยู่มากมายในสคริปต์เหล่านี้ การค้นหาโดย Google อย่างรวดเร็วช่วยให้ฉันกระจ่างคำถามนี้ฉันแชร์กับทุกคนเพื่อให้เราทุกคนได้เรียนรู้:

    สคริปต์:
    http://pastebin.com/faAQb35w

    คำอธิบาย:
    ประกาศตัวแปรของรูปแบบ VAR = $ {VAR: -default_value} หมายความว่าตัวแปร VAR จะรับค่า default_value ถ้าค่าเป็นโมฆะหรือไม่มีอยู่เท่านั้น

    ตัวอย่างการปฏิบัติ:
    เมื่อเรียกใช้สคริปต์ระบบจะขอให้ป้อนค่าที่จะเก็บไว้ในตัวแปร VAR หากมีการป้อนข้อมูลจะแสดงสิ่งที่ป้อน หากเราไม่ป้อนอะไรเลยและกด Enter เรากำลังประกาศตัวแปร VAR เป็น null ดังนั้นจึงแสดง value_default

    อาศิรพจน์

    1.    KZKG ^ กาอาระ dijo

      ฮ่าฮ่าฉันไม่รู้ว่า😀
      โอเคขอบคุณมากเพื่อน ... นั่นคือสิ่งที่ฉันหมายถึงในตอนท้ายของบทความฉันไม่ได้ตั้งใจที่จะสอนอะไรบางอย่างและนั่นก็คือฉันรู้ว่าฉันจะเรียนรู้สิ่งใหม่ ๆ ที่นี่เสมอ😀

      ทักทายและขอบคุณอีกครั้ง

      1.    เหมาะสม dijo

        คุณพูดถูกคนหนึ่งเรียนรู้หลายสิ่งที่นี่

        ทักทายและสุขสันต์วันหยุด !! 😀

  4.   ลูคัสมาเทียส dijo

    +1 ที่ยอดเยี่ยมและอธิบายได้ดีเยี่ยมเวลาที่จะนำคุณ ...
    แต่ฉันก็คุ้มค่ากับความพยายาม😉

    1.    KZKG ^ กาอาระ dijo

      อันที่จริงฉันเขียน 80% ในเวลาเพียง 1 วันฉันใช้เวลานานมากในการเผยแพร่เพียงเพราะอินเทอร์เน็ตไม่ยอมให้ฉัน
      ขอบคุณสำหรับความคิดเห็นของคุณ😉

  5.   ฮิวโก้ dijo

    อีกวิธีในการดำเนินการคือการใช้ DNS เนื่องจากบางครั้งเครือข่ายมีโปรโตคอล ICMP ถูกบล็อก:

    (โฮสต์ -ta IP-ADDRESS> / dev / null 2> & 1) && echo "เชื่อมต่อกับเครือข่าย"

    คุณจะสังเกตเห็นว่าในตัวอย่างนี้การตรวจสอบค่าส่งคืนเป็นนัย im

    1.    KZKG ^ กาอาระ dijo

      คุณเป็นเพื่อนเสมอกับเคล็ดลับที่ฉันไม่รู้อย่างสมบูรณ์ HAHAHA
      ขอบคุณความคิดเห็นชื่นชมและฮิฮิ ... อีกสิ่งใหม่ที่ได้เรียนรู้😀

  6.   วันที่ dijo

    กราเซีย

    🙂

  7.   Leper_Ivan dijo

    แม้ว่าจะผ่านไปหลายวันแล้วก็ตามตั้งแต่มีการเผยแพร่หัวข้อนี้ แต่ก็มีประโยชน์ต่อฉันมากตอนนี้ฉันได้สร้างสคริปต์ออกมาแล้ว .. ขอบคุณกาอาระ ..

  8.   Edgar navarro dijo

    หมอขอบคุณสำหรับความช่วยเหลือที่คุณทำให้ฉันเข้าใจ

    เพียงแค่สอบถามฉันจะทำอย่างไรเมื่อคอมพิวเตอร์เครื่องหนึ่งหยุด ping โดยอัตโนมัติ IP ของการเปลี่ยนแปลงอื่น ๆ ฉันมีสิ่งนี้

    เพื่อเปลี่ยน IP
    #! / bin / ทุบตี
    ping -c 10 192.168.1.50 # ถ้าไม่ ping โดยอัตโนมัติ
    ifconfig eth0 192.168.1.50 netmask 255.255.255.0 ออกอากาศ 192.168.1.0
    ifconfig eth0 ลง
    ifconfig eth0 ขึ้น

  9.   อับราฮัม dijo

    เพราะเมื่อเปรียบเทียบกับ if you use the question mark? อะไรคือความแตกต่างระหว่างการใส่? จดหมายอื่น ๆ

    1.    KZKG ^ กาอาระ dijo

      $? หมายถึง 'เอาต์พุตก่อนหน้าหรือเอาต์พุต' นั่นคือในกรณีที่ผลลัพธ์ของคำสั่งก่อนหน้า ... 🙂

      1.    แอนดรู dijo

        มีอีกวิธีหนึ่งในการบรรลุผลลัพธ์เดียวกันโดยส่งคำสั่ง ping โดยตรงเป็นอาร์กิวเมนต์ไปที่ if:

        ถ้า ping -c 1 IP-ADDRESS; แล้ว
        ก้อง "ใช่มันอยู่ในเน็ต"
        อื่น
        เสียงสะท้อน "ไม่อยู่ในเครือข่าย"
        fi

        สิ่งที่เกิดขึ้นคือหากประเมินค่าที่ส่งคืนของคำสั่งที่คุณส่งผ่านเป็นอาร์กิวเมนต์หากส่งคืนค่า 0 ว่าเป็นจริงสิ่งอื่นใดเป็นเท็จ วงเล็บเหลี่ยมเทียบเท่ากับคำสั่งทดสอบ แต่คุณสามารถส่งคำสั่งใด ๆ เป็นอาร์กิวเมนต์ได้ (ตราบใดที่คำสั่งส่งคืนค่าบางอย่าง)

  10.   ความนับถือ dijo

    สวัสดีฉันจะรัน script.sh กับผู้ใช้ X ในสคริปต์ได้อย่างไรฉันสร้างผู้ใช้ Y และผู้ใช้ Y นั้นยังคงเรียกใช้สคริปต์ต่อไป

    ทำได้แค่นี้ ??

  11.   กุ๊กโตส dijo

    น่าสนใจมากขอบคุณ!

  12.   ฟรานซิส dijo

    ขอบคุณสำหรับการสนับสนุนฉันใช้เวลาหนึ่งชั่วโมงในการทำความเข้าใจ xD แต่ฉันเข้าใจแล้ว !!!!

  13.   เอลอย dijo

    บทก็ใช้ได้ ในทางคณิตศาสตร์มันสามารถทำได้ในฐานะ ($? == 0) ถ้ามันเท่ากับศูนย์มันไม่ได้อยู่บนเครือข่ายมิฉะนั้นมันจะอยู่บนเครือข่าย และถ้าเรายังต้องการทำให้มันมีการโต้ตอบมากขึ้นเราสามารถพูดได้ว่า:
    echo -n ป้อน IP:
    อ่าน ip
    ping -c 1 $ ip

  14.   Dario dijo

    สวัสดีฉันใหม่มากสำหรับสิ่งนี้ฉันกำลังพยายามสร้างหมายเลขตั๋ว (ตัวอักษรและตัวเลข) ผ่านการอ่านและฉันต้องการว่าหากสิ่งที่ป้อนมีรูปแบบที่ถูกต้อง (ABC-123456) ให้รันคำสั่ง "x" และฉันก็ไม่ ' ไม่ทราบวิธีทำคุณช่วยฉันได้ไหม

    echo "ป้อนตั๋ว"
    อ่าน -p ตั๋ว

    ถ้า $ ticket = "ไม่มีความคิด (รูปแบบ ABC-123456"); จากนั้น cp file.txt $ ticket; อื่นสะท้อน "รูปแบบไม่ถูกต้องลองอีกครั้ง"; อ่าน -p; fi.

    แน่นอนว่ามันน่ากลัวและพวกเขาก็หัวเราะฮ่า ๆ แต่อย่างที่ฉันบอกว่าฉันเพิ่งเริ่มจากสิ่งนี้

    ถ้าฉันอธิบายไม่ดีโปรดบอกฉันและฉันจะพยายามทำให้ดีขึ้น

    กอดทุกคน.

  15.   ฮัมเบอร์โตวาย dijo

    คำอธิบายที่ยอดเยี่ยมทักทาย

  16.   คล่องตัว dijo

    ฉันมีข้อสงสัยเล็กน้อยกับ if, else และคนอื่น ๆ
    ฉันต้องการให้สคริปต์ตรวจสอบว่ามีไฟล์อยู่ (หนึ่งในบันทึก) และหากไม่มี ให้สร้างไฟล์แล้วเขียนในภายหลัง แต่ถ้ามันมีอยู่ ฉันอยากให้คุณเขียนถึงมัน

    สิ่งที่ฉันมีคือ:

    วันที่ = `วันที่ -R`
    #ฉันกำลังทดสอบวันที่ตัวแปร ซึ่งไม่ได้อัปเดตระหว่างการเริ่มต้นของ a
    #กระบวนการและสิ้นสุด บางครั้งหนึ่งชั่วโมงอาจผ่านไป และเวลาที่ถูกต้องไม่ออกมา

    ถ้า [-f /home/user/logs/test.log];
    แล้วก็
    แตะ /home/usuario/logs/test.log
    อื่น
    echo "$ วันที่: อัปเดต" >> /home/user/logs/test.log
    เสียงสะท้อน «———————————————- » >> /home/user/logs/test.log
    fi

    ตามทฤษฎีแล้วน่าจะใช้ได้ แต่ความจริงคือไม่มีการอัปเดตหากไฟล์อ้างอิงมีอยู่แล้ว

    1.    คล่องตัว dijo

      ขอโทษค่ะ เห็นว่าไม่ได้ส่งไปเพิ่มเป็นสองเท่า