stringContain
variantes (compatibles o independientes de mayúsculas y minúsculas)
Como estas respuestas de desbordamiento de pila se refieren principalmente a Bash , he publicado una función Bash independiente del caso en la parte inferior de esta publicación ...
De todos modos, ahí está mi
Respuesta compatible
Como ya hay muchas respuestas usando las características específicas de Bash, hay una manera de trabajar bajo shells con características más pobres, como BusyBox :
[ -z "${string##*$reqsubstr*}" ]
En la práctica, esto podría dar:
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
Esto se probó en Bash, Dash , KornShell ( ksh
) y ash (BusyBox), y el resultado es siempre:
String 'echo "My string"' contain substring: 'o "M'.
String 'echo "My string"' don't contain substring: 'alt'.
String 'echo "My string"' contain substring: 'str'.
En una función
Según lo solicitado por @EeroAaltonen, aquí hay una versión de la misma demostración, probada bajo los mismos shells:
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
}
Entonces:
$ 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'.
Aviso: tiene que escapar o doble comillas y / o comillas dobles:
$ 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'.
Función simple
Esto se probó en BusyBox, Dash y, por supuesto, Bash:
stringContain() { [ -z "${2##*$1*}" ]; }
Entonces ahora:
$ 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 si la cadena enviada pudiera estar vacía, como lo señaló @Sjlver, la función sería:
stringContain() { [ -z "${2##*$1*}" ] && [ -z "$1" -o -n "$2" ]; }
o como lo sugiere el comentario de Adrian Günter , evitando -o
interruptores:
stringContain() { [ -z "${2##*$1*}" ] && { [ -z "$1" ] || [ -n "$2" ];};}
Función final (simple):
E invirtiendo las pruebas para que sean potencialmente más rápidas:
stringContain() { [ -z "$1" ] || { [ -z "${2##*$1*}" ] && [ -n "$2" ];};}
Con cadenas vacías:
$ if stringContain '' ''; then echo yes; else echo no; fi
yes
$ if stringContain 'o "M' ''; then echo yes; else echo no; fi
no
Caso independiente (¡solo Bash!)
Para probar cadenas sin cuidado de mayúsculas y minúsculas, simplemente convierta cada cadena a minúsculas:
stringContain() {
local _lc=${2,,}
[ -z "$1" ] || { [ -z "${_lc##*${1,,}*}" ] && [ -n "$2" ] ;} ;}
Cheque:
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