stringContain
variantes (compatibles ou indépendantes du boîtier)
Comme ces réponses Stack Overflow parlent principalement de Bash , j'ai posté une fonction Bash indépendante de la casse tout en bas de cet article ...
Quoi qu'il en soit, il y a mon
Réponse compatible
Comme il y a déjà beaucoup de réponses en utilisant des fonctionnalités spécifiques à Bash, il existe un moyen de travailler sous des shells plus pauvres, comme BusyBox :
[ -z "${string##*$reqsubstr*}" ]
En pratique, cela pourrait donner:
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
Cela a été testé sous Bash, Dash , KornShell ( ksh
) et ash (BusyBox), et le résultat est toujours:
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 une seule fonction
Comme l'a demandé @EeroAaltonen, voici une version de la même démo, testée sous les mêmes 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
}
Alors:
$ 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'.
Remarque: vous devez échapper ou insérer des guillemets doubles et / ou des guillemets doubles:
$ 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'.
Fonction simple
Cela a été testé sous BusyBox, Dash et, bien sûr, Bash:
stringContain() { [ -z "${2##*$1*}" ]; }
Alors maintenant:
$ 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
... Ou si la chaîne soumise pouvait être vide, comme l'a souligné @Sjlver, la fonction deviendrait:
stringContain() { [ -z "${2##*$1*}" ] && [ -z "$1" -o -n "$2" ]; }
ou comme suggéré par le commentaire d'Adrian Günter , en évitant les -o
changements:
stringContain() { [ -z "${2##*$1*}" ] && { [ -z "$1" ] || [ -n "$2" ];};}
Fonction finale (simple):
Et inverser les tests pour les rendre potentiellement plus rapides:
stringContain() { [ -z "$1" ] || { [ -z "${2##*$1*}" ] && [ -n "$2" ];};}
Avec des chaînes vides:
$ if stringContain '' ''; then echo yes; else echo no; fi
yes
$ if stringContain 'o "M' ''; then echo yes; else echo no; fi
no
Indépendant du cas (Bash uniquement!)
Pour tester des chaînes sans se soucier de la casse, convertissez simplement chaque chaîne en minuscules:
stringContain() {
local _lc=${2,,}
[ -z "$1" ] || { [ -z "${_lc##*${1,,}*}" ] && [ -n "$2" ] ;} ;}
Vérifier:
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