Si të dalloni nëse një varg Bash përmban një nënvarg në Linux


Ndonjëherë në skriptet Linux, ju dëshironi të dini nëse një varg teksti përmban një varg specifik, më të vogël. Ka shumë mënyra për ta bërë këtë. Ne ju tregojmë disa teknika të thjeshta dhe të besueshme.

Pse është e dobishme kjo?

Kërkimi i një vargu për një nënvarg më të vogël është një kërkesë e zakonshme. Një shembull do të ishte leximi i tekstit nga një skedar ose nga hyrja njerëzore dhe kërkimi i vargut për një nënvarg specifik në mënyrë që skripti juaj të vendosë se çfarë të bëjë më pas. Mund të jetë në kërkim të një etikete ose emri pajisjeje në një skedar konfigurimi ose një varg komande në një linjë të dhënash nga një përdorues.

Përdoruesit e Linux janë të bekuar me çdo numër të shërbimeve për manipulimin e tekstit. Disa janë të integruara në guaskën Bash, të tjerat ofrohen si shërbime ose aplikacione të pavarura. Ekziston një arsye pse sistemet operative të rrjedhura nga Unix shërbehen në mënyrë të pasur me aftësi të manipulimit të vargjeve.

Disa gjëra që duken si skedarë nuk janë skedarë të thjeshtë. Ata janë skedarë të veçantë që përfaqësojnë gjëra të tilla si pajisjet harduerike dhe burimet e informacionit të sistemit. Abstraksioni i kryer nga sistemi operativ u jep atyre pamjen dhe karakteristikat e skedarëve. Ju mund të lexoni informacion prej tyre - si tekst, natyrisht - dhe në disa raste t'u shkruani atyre, por ato nuk janë skedarë të zakonshëm.

Teksti përdoret gjithashtu si hyrje dhe dalje për komandat në një dritare terminali. Kjo lejon ridrejtimin dhe tubacionet e hyrjes dhe daljes. Ky funksionalitet mbështet aftësinë për të zinxhiruar sekuencat e komandave Linux së bashku, duke kaluar daljen nga një komandë si hyrje në tjetrën.

Pavarësisht nga origjina e tij, kërkimi i tekstit që marrim për një fjalë të rëndësishme, komandë, etiketë ose ndonjë tregues tjetër është një pjesë standarde e trajtimit të të dhënave të bazuara në tekst. Këtu është një koleksion teknikash të thjeshta që mund t'i përfshini në skriptet tuaja.

Gjetja e nënvargjeve me Bash Builtins

Testi i krahasimit të vargjeve [...]] me dy kllapa mund të përdoret në deklaratat if për të përcaktuar nëse një varg përmban një varg tjetër.

Kopjojeni këtë skript në një redaktues dhe ruajeni në një skedar të quajtur double.sh.

#!/bin/bash

if [[ "monkey" = *"key"* ]]; then
  echo "key is in monkey"
else
  echo "key is not in monkey"
fi

Do t'ju duhet ta bëni skriptin të ekzekutueshëm me komandën chmod. Ky është një hap që kërkohet gjithmonë për të bërë çdo skenar të ekzekutueshëm. Ju do të duhet ta bëni këtë sa herë që krijoni një skedar skripti. Zëvendësoni emrin e skenarit të duhur në secilin rast.

chmod +x double.sh

Le të ekzekutojmë skenarin.

./double.sh

Kjo funksionon sepse ylli * përfaqëson çdo sekuencë karakteresh, duke përfshirë asnjë karakter. Nëse çelësi i nënvargut ndodhet brenda vargut të synuar, me ose pa ndonjë karakter përpara ose pas tij, testi do të kthehet i vërtetë.

Në shembullin tonë, ka karaktere përpara nënvargut. Këto përputhen me yllin e parë. Nuk ka shkronja prapa nënvargut, por, për shkak se një yll gjithashtu nuk përputhet me asnjë karakter, testi ende kalon.

Për fleksibilitet, ne mund të modifikojmë skriptin tonë për të trajtuar variablat në vend të vargjeve të fjalëpërfjalshme. Ky është skenari double2.sh.

#!/bin/bash

string="Monkey"
substring="key"

if [[ $string = *$substring* ]]; then
  echo "$substring was found in $string"
else
  echo "$substring was not found in $string"
fi

Le të shohim se si funksionon.

./double2.sh

Kjo funksionon në të njëjtën mënyrë, me avantazhin që ne mund të përdorim emrat e ndryshoreve në vend të vargjeve literale. Shndërrimi i zgjidhjes sonë të vogël në funksion do të sigurojë fleksibilitetin më të madh.

Ky është skript double3.sh.

#!/bin/bash

shopt -s nocasematch

string="Monkey"
substring="Key"
capital="London"

check_substring ()
{
if [[ $1 = *$2* ]]; then
  echo "$2 was found in $1"
else
  echo "$2 was not found in $1"
fi
}

check_substring "Monkey" "key" 
check_substring $string $substring
check_substring $string "banana"
check_substring "Wales" $capital

Ne e quajmë funksionin tonë check_substring duke përdorur një përzierje të variablave dhe vargjeve literale. Ne përdorëm shopt me opsionin e tij -s (set) për të vendosur nocasematch, për t'i bërë ndeshjet të pandjeshme ndaj shkronjave të vogla.

Ja si funksionon.

./double3.sh

Ne mund të përdorim trukun e mbështjelljes së nënvargut me yllza edhe në deklaratat rast. Ky është rasti.sh.

#!/bin/bash

shopt -s nocasematch

string="Wallaby"
substring="Wall"

case $string in

  *$substring*)
    echo "$substring was found in $string"
    ;;

  *)
    echo "Nothing matched: $string"
    ;;
esac

Përdorimi i deklaratave rast në vend të deklaratave shumë të gjata if mund t'i bëjë skriptet më të lehta për t'u lexuar dhe korrigjuar. Nëse duhet të kontrolloni nëse një varg përmban një nga shumë nënvargje të mundshme, deklarata rast do të ishte zgjidhja më e mirë.

./case.sh

Gjendet nënvargu.

Gjetja e nënvargjeve me grep

Përtej ndërtimeve të Bash, mjeti i parë i kërkimit të tekstit që ndoshta do të arrini është grep. Ne mund të përdorim aftësinë e lindur të grep për të kërkuar një varg brenda një vargu për të kërkuar nënvargjet tona.

Ky skenar quhet subgrep.sh.

#!/bin/bash

string="porridge pot"
substring="ridge"

if $(echo $string | grep -q $substring); then
  echo "$substring was found in $string"
else
  echo "$substring was not found in $string"
fi

Skripti përdor echo për të dërguar vargun në grep, i cili kërkon për nënvargun. Ne po përdorim opsionin -q (i qetë) për të ndaluar grep shkrimin e çdo gjëje në dalje standarde.

Nëse rezultati i komandave brenda kllapave “(...)” është i barabartë me zero, do të thotë se është gjetur një përputhje. Për shkak se zero barazohet me true në Bash, deklarata if plotësohet dhe klauzola pastaj ekzekutohet.

Le të shohim se cili është rezultati i tij.

./subgrep.sh

Gjetja e nënvargjeve me sed

Mund të përdorim edhe sed për të gjetur një nënvarg.

Si parazgjedhje, sed shtyp të gjithë tekstin që futet në të. Përdorimi i sed -n e parandalon këtë. Të vetmet rreshta që shtypen janë rreshtat që përputhen. Kjo shprehje do të printojë çdo rresht që përputhet ose përmban vlerën e $substring.

"/$substring/p"

Ne e fusim vlerën e $stringsed duke përdorur një ridrejtim këtu, <<<. Kjo përdoret për të ridrejtuar vlerat në një komandë në guaskën aktuale. Ai nuk thërret një nënshell në mënyrën që do të bënte një tub.

E para -n është testi. Do të kthehet true nëse dalja nga komanda sed është jo zero. E vetmja mënyrë se si dalja nga sed mund të jetë jo zero është nëse gjendet një linjë që përputhet. Nëse është kështu, $substring duhet të jetë gjetur në $string.

Kjo është subsed.sh.

#!/bin/bash

string="Sweden"
substring="eden"

if [ -n "$(sed -n "/$substring/p" <<< $string)" ]; then
  echo "$substring was found in $string"
else
  echo "$substring was not found in $string"
fi

Ne marrim përgjigjen e pritur kur ekzekutojmë skenarin.

./subsed.sh

Mund të testojmë logjikën e skriptit duke redaktuar vlerën e $substring në mënyrë që krahasimi të dështojë.

./subsed.sh

Ndalo kërkimin, e gjeta

Mjete të tjera mund të gjejnë nënvargje, të tilla si awk dhe Perl por një rast i thjeshtë përdorimi si gjetja e një nënvargu nuk garanton funksionalitetin e tyre shtesë dhe as kompleksitetin e shtuar. Në veçanti, përdorimi i ndërlidhjeve të Bash për të kërkuar nënvargje është i shpejtë, i thjeshtë dhe nuk kërkon mjete të jashtme.