Risposte:
Utilizza la corrispondenza con caratteri jolly. Per bash in particolare:
if [[ $longstring == *mystr* ]]; then
if [[ $longstring == *"my string"* ]]; then
if [[ $longstring == *"$matchstr"* ]]; then
Nel [[
operatore, il lato sinistro è espanso letteralmente (cioè senza la necessità di virgolette), mentre le parti non quotate del lato destro sono trattate come caratteri jolly - fondamentalmente le stesse regole di quotatura di un case
dichiarazione.
È anche possibile utilizzare la corrispondenza regex di POSIX:
if [[ $longstring =~ mystr ]]; then
if [[ $longstring =~ "my string" ]]; then
if [[ $longstring =~ "$matchstr" ]]; then
Ancora una volta, le parti citate del lato destro sono abbinate letteralmente mentre le parti non quotate sono abbinate come operatori regex.
Se hai bisogno sh Compatibilità:
case $longstring in
*mystr*)
echo yes;;
*"$matchstr"*)
echo yes again!;;
*)
echo no;;
esac
In alternativa, se stai abusando della lingua:
if case $longstring in
*mystr*) true;;
*"$matchstr"*) true;;
*) false;;
esac; then
...
fi
(Questo if / case / esac / then form è effettivamente utile in alcune situazioni, come quando si effettua una whitelist o lista nera incrementale.)
Versione più breve:
if ! case $longstring in *"$matchstr"*) !; esac; then
echo "It matched!"
fi
Molti script sh usano expr
ma non è un built-in di shell, quindi un po 'più lento:
if expr match "$longstring" ".*mystr"; then
...
fi
In questo caso (dato che expr non può vedere le differenze nel quoting) l'intero parametro "match" è interpretato come una regex ancorata (come grep ma sempre con un ^
anteporre). Quindi fai attenzione quando passi una variabile come partita.
Questo lo farà:
#! /bin/bash
X=`echo "a long string with mystring in it" | grep "mystr" | wc -l`
if [ $X -gt 0 ]
then
echo "found string";
fi
L'idea è che "echo" imposta la stringa, grep cerca la sottostringa nella stringa passata e wc -l restituisce il numero di righe in cui è stata trovata la stringa - quindi 0 o 1.
if echo ... | grep -q ...; then
Puoi usare bash
espansione dei parametri:
if [ "${TestString/$SearchString/}" == "$TestString" ]; then echo Found; fi
o se vuoi un'espressione compatibile con Bourne:
if [ "${TestString#*$SearchString}" == "$TestString" ]; then echo Found; fi
$SearchString
può essere un valore letterale: può contenere spazi, sia letterali che variabili, e una variabile può contenere }
, ma in un letterale deve essere sfuggito come \}
. Nella prima forma, la stessa considerazione vale anche per /
.