stringContain
varianti (compatibile o indipendente dal caso)
Dato che queste risposte di Stack Overflow parlano principalmente di Bash , ho pubblicato un caso indipendente funzione Bash in fondo a questo post ...
Comunque, c'è il mio
Risposta compatibile
Dato che ci sono già molte risposte usando le funzionalità specifiche di Bash, c'è un modo di lavorare con shell con funzionalità scadenti, come BusyBox :
[ -z "${string##*$reqsubstr*}" ]
In pratica, questo potrebbe dare:
string='echo "My string"'
for reqsubstr in 'o "M' 'alt' 'str';do
if [ -z "${string##*$reqsubstr*}" ] ;then
echo "String '$string' contain substring: '$reqsubstr'."
else
echo "String '$string' don't contain substring: '$reqsubstr'."
fi
done
Questo è stato testato su Bash, Dash , KornShell ( ksh
) e ash (BusyBox) e il risultato è sempre:
String 'echo "My string"' contain substring: 'o "M'.
String 'echo "My string"' don't contain substring: 'alt'.
String 'echo "My string"' contain substring: 'str'.
In una funzione
Come richiesto da @EeroAaltonen, ecco una versione della stessa demo, testata con le stesse shell:
myfunc() {
reqsubstr="$1"
shift
string="$@"
if [ -z "${string##*$reqsubstr*}" ] ;then
echo "String '$string' contain substring: '$reqsubstr'.";
else
echo "String '$string' don't contain substring: '$reqsubstr'."
fi
}
Poi:
$ myfunc 'o "M' 'echo "My String"'
String 'echo "My String"' contain substring 'o "M'.
$ myfunc 'alt' 'echo "My String"'
String 'echo "My String"' don't contain substring 'alt'.
Avviso: devi scappare o racchiudere tra virgolette e / o virgolette doppie:
$ myfunc 'o "M' echo "My String"
String 'echo My String' don't contain substring: 'o "M'.
$ myfunc 'o "M' echo \"My String\"
String 'echo "My String"' contain substring: 'o "M'.
Funzione semplice
Questo è stato testato sotto BusyBox, Dash e, ovviamente, Bash:
stringContain() { [ -z "${2##*$1*}" ]; }
Quindi ora:
$ if stringContain 'o "M3' 'echo "My String"';then echo yes;else echo no;fi
no
$ if stringContain 'o "M' 'echo "My String"';then echo yes;else echo no;fi
yes
... O se la stringa inviata potesse essere vuota, come sottolineato da @Sjlver, la funzione diventerebbe:
stringContain() { [ -z "${2##*$1*}" ] && [ -z "$1" -o -n "$2" ]; }
o come suggerito dal commento di Adrian Günter , evitando -o
interruzioni:
stringContain() { [ -z "${2##*$1*}" ] && { [ -z "$1" ] || [ -n "$2" ];};}
Funzione (semplice) finale:
E invertendo i test per renderli potenzialmente più veloci:
stringContain() { [ -z "$1" ] || { [ -z "${2##*$1*}" ] && [ -n "$2" ];};}
Con stringhe vuote:
$ if stringContain '' ''; then echo yes; else echo no; fi
yes
$ if stringContain 'o "M' ''; then echo yes; else echo no; fi
no
Caso indipendente (solo Bash!)
Per testare le stringhe senza preoccuparsi del caso, è sufficiente convertire ciascuna stringa in minuscolo:
stringContain() {
local _lc=${2,,}
[ -z "$1" ] || { [ -z "${_lc##*${1,,}*}" ] && [ -n "$2" ] ;} ;}
Dai un'occhiata:
stringContain 'o "M3' 'echo "my string"' && echo yes || echo no
no
stringContain 'o "My' 'echo "my string"' && echo yes || echo no
yes
if stringContain '' ''; then echo yes; else echo no; fi
yes
if stringContain 'o "M' ''; then echo yes; else echo no; fi
no