จะบอกได้อย่างไรว่า Bash String มี Substring บน Linux

เผยแพร่แล้ว: 2022-09-21
แล็ปท็อป Linux แสดง bash prompt
fatmawati achmad zaenuri/Shutterstock.com

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

ทำไมสิ่งนี้จึงมีประโยชน์?

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

ผู้ใช้ลีนุกซ์ได้รับพรด้วยยูทิลิตี้มากมายสำหรับจัดการข้อความ บางตัวสร้างไว้ใน Bash shell ส่วนบางตัวมีให้เป็นยูทิลิตี้หรือแอพพลิเคชั่นแบบสแตนด์อโลน มีเหตุผลที่ระบบปฏิบัติการที่ได้รับมาจาก Unix ได้รับการบริการอย่างครบครันพร้อมความสามารถในการจัดการสตริง

วิธีจัดการสตริงใน Bash บน Linux
ที่เกี่ยวข้อง วิธีจัดการกับสตริงใน Bash บน Linux

บางสิ่งที่ดูเหมือนไฟล์ไม่ใช่ไฟล์ธรรมดา เป็นไฟล์พิเศษที่ แสดงถึงสิ่งต่างๆ เช่น อุปกรณ์ฮาร์ดแวร์และแหล่งข้อมูลระบบ สิ่งที่เป็นนามธรรมที่ดำเนินการโดยระบบปฏิบัติการทำให้พวกเขามีลักษณะและลักษณะของไฟล์ คุณสามารถอ่านข้อมูลจากพวกเขา—เป็นข้อความ, เป็นธรรมชาติ— และในบางกรณีเขียนถึงพวกเขา แต่ไม่ใช่ไฟล์ธรรมดา

ข้อความยังใช้เป็นอินพุตและเอาต์พุตสำหรับคำสั่งในหน้าต่างเทอร์มินัล ซึ่งช่วยให้สามารถเปลี่ยนเส้นทางและไพพ์ของอินพุตและเอาต์พุตได้ ฟังก์ชันดังกล่าวสนับสนุนความสามารถในการเชื่อมโยงลำดับของคำสั่ง Linux เข้าด้วยกัน โดยส่งผ่านเอาต์พุตจากคำสั่งหนึ่งเป็นอินพุตไปยังคำสั่งถัดไป

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

การค้นหาสตริงย่อยด้วย Bash Builtins

การทดสอบการเปรียบเทียบสตริงเครื่องหมายวงเล็บคู่ “ [[...]] ” สามารถใช้ในคำสั่ง if เพื่อตรวจสอบว่าสตริงหนึ่งมีสตริงอื่นหรือไม่

คัดลอกสคริปต์นี้ไปยังโปรแกรมแก้ไข และบันทึกลงในไฟล์ชื่อ “double.sh”

 #!/bin/bash

ถ้า [[ "monkey" = *"key"* ]]; แล้ว
  echo "กุญแจอยู่ในลิง"
อื่น
  echo "กุญแจไม่อยู่ในลิง"
fi 
วิธีใช้การทดสอบแบบมีเงื่อนไข Double Bracket ใน Linux
วิธี ใช้การทดสอบแบบมีเงื่อนไขวงเล็บคู่ใน Linux

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

 chmod +x double.sh 

ทำให้สคริปต์สามารถเรียกใช้งานได้ด้วย chmod

มาเรียกใช้สคริปต์กันเถอะ

 ./double.sh 

การรันสคริปต์ double.sh

วิธีนี้ใช้ได้เพราะเครื่องหมายดอกจัน ” * ” หมายถึงลำดับของอักขระใดๆ รวมถึงไม่มีอักขระ หากสตริงย่อย "คีย์" อยู่ภายในสตริงเป้าหมาย โดยมีหรือไม่มีอักขระอยู่ข้างหน้าหรือข้างหลัง การทดสอบจะคืนค่าเป็น "จริง"

ในตัวอย่างของเรา มีอักขระอยู่ด้านหน้าสตริงย่อย เหล่านี้ตรงกับเครื่องหมายดอกจันแรก ไม่มีตัวอักษรอยู่ด้านหลังสตริงย่อย แต่เนื่องจากเครื่องหมายดอกจันไม่ตรงกับอักขระใดๆ การทดสอบจึงยังคงผ่าน

เพื่อความยืดหยุ่น เราสามารถแก้ไขสคริปต์ของเราเพื่อจัดการกับตัวแปรแทนสตริงตามตัวอักษร นี่คือสคริปต์ “double2.sh”

 #!/bin/bash

string="ลิง"
สตริงย่อย="คีย์"

ถ้า [[ $string = *$substring* ]]; แล้ว
  echo "พบ $substring ใน $string"
อื่น
  echo "ไม่พบ $substring ใน $string"
fi

เรามาดูกันว่ามันทำงานอย่างไร

 ./double2.sh 

การรันสคริปต์ double2.sh

วิธีนี้ใช้ได้ผลเช่นเดียวกัน โดยเราสามารถใช้ชื่อตัวแปรแทนสตริงตามตัวอักษรได้ การเปลี่ยนโซลูชันเล็กๆ ของเราให้เป็นฟังก์ชันจะให้ความยืดหยุ่นสูงสุด

นี่คือสคริปต์ “double3.sh”

 #!/bin/bash

shopt -s nocasematch

string="ลิง"
สตริงย่อย="คีย์"
ทุน="ลอนดอน"

check_substring ()
{
ถ้า [[ $1 = *$2* ]]; แล้ว
  echo "พบ $2 ใน $1"
อื่น
  echo "ไม่พบ $2 ใน $1"
fi
}

check_substring "ลิง" "คีย์" 
check_substring $string $substring
check_substring $string "กล้วย"
check_substring "เวลส์" $capital

เราเรียกฟังก์ชัน check_substring โดยใช้ตัวแปรและสตริงที่เป็นตัวอักษรผสมกัน เราใช้ shopt กับตัวเลือก -s (set) เพื่อตั้งค่า nocasematch เพื่อให้การจับคู่ไม่คำนึงถึงขนาดตัวพิมพ์

นี่คือวิธีการทำงาน

 ./double3.sh 

การรันสคริปต์ double3.sh

เราสามารถใช้เคล็ดลับในการห่อสตริงย่อยด้วยเครื่องหมายดอกจันใน case คำสั่งได้เช่นกัน นี่คือ "case.sh"

 #!/bin/bash

shopt -s nocasematch

string="วัลลาบี"
สตริงย่อย="กำแพง"

กรณี $string ใน

  *$สตริงย่อย*)
    echo "พบ $substring ใน $string"
    ;;

  *)
    echo "ไม่มีข้อมูลที่ตรงกัน: $string"
    ;;
esac

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

 ./case.sh 

การรันสคริปต์ case.sh

พบสตริงย่อย

การค้นหาสตริงย่อยด้วย grep

นอกเหนือจาก Bash builtins เครื่องมือค้นหาข้อความแรกที่คุณอาจเข้าถึงคือ grep เราสามารถใช้ความสามารถโดยธรรมชาติของ grep เพื่อค้นหาสตริงภายในสตริงเพื่อค้นหาสตริงย่อยของเรา

สคริปต์นี้เรียกว่า “subgrep.sh”

 #!/bin/bash

string="หม้อโจ๊ก"
สตริงย่อย="สันเขา"

ถ้า $(echo $string | grep -q $substring); แล้ว
  echo "พบ $substring ใน $string"
อื่น
  echo "ไม่พบ $substring ใน $string"
fi

สคริปต์ใช้ echo เพื่อส่งสตริงไปยัง grep ซึ่งค้นหาสตริงย่อย เรากำลังใช้ตัวเลือก -q (เงียบ) เพื่อหยุด grep เขียนอะไรก็ได้ไปยังเอาต์พุตมาตรฐาน

วิธีใช้คำสั่ง grep บน Linux
วิธีใช้คำสั่ง grep บน Linux

หากผลลัพธ์ของคำสั่งในวงเล็บ “ (...) ” เท่ากับศูนย์ แสดงว่าพบรายการที่ตรงกัน เนื่องจากค่า 0 เท่ากับค่า true ใน Bash คำสั่ง if จะถูกดำเนินการและคำสั่ง then จะถูกดำเนินการ

เรามาดูกันว่าผลลัพธ์ของมันคืออะไร

 ./subgrep.sh 

การรันสคริปต์ subgrep.sh

การค้นหาสตริงย่อยด้วย sed

เราสามารถใช้ sed เพื่อค้นหาสตริงย่อยได้เช่นกัน

ตามค่าเริ่มต้น sed จะพิมพ์ข้อความทั้งหมดที่ป้อนเข้าไป การใช้ sed -n ป้องกันสิ่งนี้ บรรทัดเดียวที่พิมพ์คือบรรทัดที่ตรงกัน นิพจน์นี้จะพิมพ์บรรทัดใดๆ ที่ตรงกันหรือมีค่าของ $substring

 "/$สตริงย่อย/p"

เราป้อนค่าของ $string ลงใน sed โดยใช้การเปลี่ยนเส้นทางที่นี่ <<< ใช้เพื่อเปลี่ยนเส้นทางค่าไปยังคำสั่งในเชลล์ปัจจุบัน มันไม่เรียกใช้ subshell ในแบบที่ไพพ์เรียก

วิธีใช้คำสั่ง sed บน Linux
วิธีใช้คำสั่ง sed บน Linux

ตัวแรก -n คือการทดสอบ มันจะคืนค่า true หากผลลัพธ์จากคำสั่ง sed ไม่ใช่ศูนย์ วิธีเดียวที่เอาต์พุตจาก sed จะต้องไม่เป็นศูนย์คือหากพบบรรทัดที่ตรงกัน หากเป็นกรณีนี้ จะต้องพบ $substring ใน $string

นี่คือ "subs.sh"

 #!/bin/bash

string="สวีเดน"
สตริงย่อย = "เอเดน"

ถ้า [ -n "$(sed -n "/$substring/p" <<< $string)" ]; แล้ว
  echo "พบ $substring ใน $string"
อื่น
  echo "ไม่พบ $substring ใน $string"
fi

เราได้รับการตอบสนองที่คาดหวังเมื่อเราเรียกใช้สคริปต์

 ./subsed.sh 

การรันสคริปต์ subsed.sh

เราสามารถทดสอบตรรกะของสคริปต์โดยแก้ไขค่าของ $substring เพื่อให้การเปรียบเทียบล้มเหลว

./subsed.sh

การรันสคริปต์ subsed.sh ด้วยสตริงย่อยที่ไม่ตรงกัน

หยุดค้นหา พบมัน

เครื่องมืออื่นๆ สามารถค้นหาสตริงย่อย เช่น awk และ Perl ได้ แต่กรณีการใช้งานง่ายๆ เช่น การค้นหาสตริงย่อยไม่รับประกันการทำงานพิเศษหรือความซับซ้อนที่เพิ่มขึ้น โดยเฉพาะอย่างยิ่ง การใช้ Bash ในตัวเพื่อค้นหาสตริงย่อยนั้นรวดเร็ว ง่ายดาย และไม่ต้องใช้เครื่องมือภายนอก

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