Je veux voir si une chaîne de caractères se trouve à l'intérieur une partie d'une autre chaîne.
par exemple :
'ab' in 'abc' -> true
'ab' in 'bcd' -> false
Comment puis-je faire cela dans un conditionnel d'un bash script ?
Je veux voir si une chaîne de caractères se trouve à l'intérieur une partie d'une autre chaîne.
par exemple :
'ab' in 'abc' -> true
'ab' in 'bcd' -> false
Comment puis-je faire cela dans un conditionnel d'un bash script ?
[[ "bcd" =~ "ab" ]]
[[ "abc" =~ "ab" ]]
les parenthèses sont pour le test, et comme il s'agit de doubles parenthèses, il peut y avoir des tests supplémentaires comme =~
.
Vous pouvez donc utiliser ce formulaire de la manière suivante
var1="ab"
var2="bcd"
if [[ "$var2" =~ "$var1" ]]; then
echo "pass"
else
echo "fail"
fi
Edita: corrigé "=~", s'était inversé.
Vous pouvez utiliser le formulaire ${VAR/subs}
donde VAR
contient la chaîne la plus grande et subs
est la sous-chaîne que vous essayez de trouver :
my_string=abc
substring=ab
if [ "${my_string/$substring}" = "$my_string" ] ; then
echo "${substring} is not in ${my_string}"
else
echo "${substring} was found in ${my_string}"
fi
Cela fonctionne parce que ${VAR/subs}
est égal à $VAR
mais avec la première occurrence de la chaîne subs
supprimée, en particulier si $VAR
ne contient pas le mot subs
il ne sera pas modifié.
Utilisation de bash motifs de noms de fichiers (alias motifs "globaux")
substr=ab
[[ abc == *"$substr"* ]] && echo yes || echo no # yes
[[ bcd == *"$substr"* ]] && echo yes || echo no # no
Les deux approches suivantes fonctionneront dans n'importe quel environnement compatible POSIX, et pas seulement dans bash :
substr=ab
for s in abc bcd; do
if case ${s} in *"${substr}"*) true;; *) false;; esac; then
printf %s\\n "'${s}' contains '${substr}'"
else
printf %s\\n "'${s}' does not contain '${substr}'"
fi
done
substr=ab
for s in abc bcd; do
if printf %s\\n "${s}" | grep -qF "${substr}"; then
printf %s\\n "'${s}' contains '${substr}'"
else
printf %s\\n "'${s}' does not contain '${substr}'"
fi
done
Les deux résultats ci-dessus :
'abc' contains 'ab'
'bcd' does not contain 'ab'
La première solution présente l'avantage de ne pas engendrer un fichier grep
processus.
Notez que j'utilise printf %s\\n "${foo}"
au lieu de echo "${foo}"
parce que echo
peut mutiler ${foo}
s'il contient des barres obliques inverses.
C'est la solution la plus portable, elle fonctionnera même sur les vieux shells Bourne et Korn Shell.
#!/bin/bash
case "abcd" in
*$1*) echo "It's a substring" ;;
*) echo "Not a substring" ;;
esac
Exemple d'exécution :
$ ./case_substr.sh "ab"
It's a substring
$ ./case_substr.sh "whatever"
Not a substring
Notez qu'il n'est pas nécessaire d'utiliser spécifiquement la fonction echo
vous pouvez utiliser exit 1
y exit 0
pour signifier le succès ou l'échec.
Ce que nous pourrions faire également, c'est créer une fonction (qui peut être utilisée dans de grands scripts si nécessaire) avec des valeurs de retour spécifiques ( 0 en cas de correspondance, 1 en cas d'absence de correspondance) :
$ ./substring_function.sh
ab is substring
$ cat substring_function.sh
#!/bin/sh
is_substring(){
case "$2" in
*$1*) return 0;;
*) return 1;;
esac
}
main(){
if is_substring "ab" "abcdefg"
then
echo "ab is substring"
fi
}
main $@
$ grep -q 'ab' <<< "abcd" && echo "it's a substring" || echo "not a substring"
it's a substring
Cette approche particulière est utile pour les instructions if-else dans les bash
. Également très portable
$ awk '$0~/ab/{print "it is a substring"}' <<< "abcd"
it is a substring
$ python -c 'import sys;sys.stdout.write("it is a substring") if "ab" in sys.stdin.read() else exit(1)' <<< "abcd"
it is a substring
$ ruby -e ' puts "is substring" if ARGV[1].include? ARGV[0]' "ab" "abcdef"
is substring
SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.