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 $string
në sed
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.