Een veel voorkomende taak voor Bash is het bepalen of een tekenreeks (substring) in een tekst (string) voorkomt. Dit kan op verschillende manieren.
De eenvoudigste manier is het insluiten van de op te sporen tekenreeks (substring) tussen asterisk tekens en dit te vergelijken met de tekst (string). Het voorbeeld gebruikt een if conditie en de 'komt overeen' operator (==) om te controleren of de substring SUB in de string STR voorkomt:
#!/bin/bash STR='GNU/Linux is een besturingssysteem' SUB='Linux' if [[ "$STR" == *"$SUB"* ]]; then echo "De tekst bevat de tekenreeks $SUB." fi
Bij het uitvoeren, wordt het volgende weergegeven:
dany@main:~> sh substring.sh De tekst bevat de tekenreeks Linux.
Je kunt de if conditie door een case structuur vervangen. Ons script wordt dan:
#!/bin/bash STR='GNU/Linux is een besturingssysteem' SUB='Linux' case $STR in *"$SUB"*) echo "De tekst bevat de tekenreeks $SUB." ;; esac
Vervangen we in de if conditie de 'komt overeen' operator (==) door de regex operator (=~) dan verwacht bash een reguliere expressie in de daarop volgende string. Een punt gevolgd door een asterisk (.*) komt overeen met geen of meerdere willekeurige tekens (uitgezonderd het newline teken).
#!/bin/bash STR='GNU/Linux is een besturingssysteem' SUB='Linux' if [[ "$STR" =~ .*"$SUB".* ]]; then echo "De tekst bevat de tekenreeks $SUB." fi
De grep opdracht is een specialist in het opsporen van tekenreeksen in teksten. We geven de STR string en de op te sporen SUB substring door aan grep en krijgen een true (gevonden) of false (niet gevonden) terug.
#!/bin/bash STR='GNU/Linux is een besturingssysteem' SUB='Linux' if grep -q "$SUB" <<< "$STR"; then echo "De tekst bevat de tekenreeks $SUB." fi
De -q (--quiet) optie zorgt dat grep niets weergeeft.
Controleren of een string een substring bevat is een veel voorkomende taak in Bash scripts. Je kreeg hier een paar methoden, maar wie de awk of sed opdracht kent, kan ook deze opdrachten gebruiken om het gewenst resultaat te bereiken.