252 votes

Comment annuler un test avec des expressions régulières dans un script bash?

Avec GNU bash (version 4.0.35 (1) -release (x86_64-suse-linux-gnu), je voudrais annuler un test avec des expressions régulières. Par exemple, je voudrais ajouter conditionnellement un chemin à la variable PATH, si le chemin n'est pas déjà là, comme dans:

 TEMP=/mnt/silo/bin
if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/Scripts:
if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/local/bin
if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi
export PATH
 

Je suis sûr qu'il y a un million de façons de le faire, mais j'aimerais savoir si le conditionnel peut être annulé d'une manière ou d'une autre, comme dans (erroné):

 TEMP=/mnt/silo/bin
if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/Scripts:
if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/local/bin
if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi
export PATH
 

Merci!

290voto

SiegeX Points 32614

Vous avez eu raison, il suffit de mettre un espace entre les ! et les [[ comme if ! [[

174voto

Dennis Williamson Points 105818

Vous pouvez également mettre le point d'exclamation entre les crochets:

 if [[ ! $PATH =~ $temp ]]
 

mais vous devriez ancrer votre modèle pour réduire les faux positifs:

 temp=/mnt/silo/bin
pattern="(^|:)$temp(:|$)"
if [[ ! $PATH =~ $pattern ]]
 

qui cherche une correspondance au début ou se termine par deux points avant ou après celle-ci (ou les deux). Je recommande d'utiliser des noms de variables en minuscules ou en majuscules pour réduire le risque de collision de noms avec les variables de shell.

25voto

le moyen le plus sûr est de mettre le! pour la négation de la regex dans le double] comme ceci:

 if [[ ! ${STR} =~ YOUR_CRAPPY_REGEX ]]; then
 

sinon, il pourrait échouer sur certains systèmes.

10voto

Mark Byers Points 318575

Oui, vous pouvez nier le test comme SiegeX l’ a déjà indiqué.

Cependant, vous ne devriez pas utiliser d'expressions régulières pour cela - cela peut échouer si votre chemin contient des caractères spéciaux. Essayez ceci à la place:

 [[ ":$PATH:" != *":$1:"* ]]
 

(La source)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X