Utilizando GNU bash (versión 4.0.35 (1) -release (x86_64-suse-linux-gnu), me gustaría negar una prueba con expresiones regulares. Por ejemplo, me gustaría agregar condicionalmente una ruta a la variable PATH, si el camino aún no está allí, como en:
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
Estoy seguro de que hay un millón de formas de hacer esto, pero lo que me gustaría saber es si el condicional se puede negar de alguna manera, como en (lo erróneo):
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
regex
bash
conditional
negate
David Rogers
fuente
fuente
También puede poner el signo de exclamación dentro de los corchetes:
pero debe anclar su patrón para reducir los falsos positivos:
que busca una coincidencia al principio o al final con dos puntos antes o después (o ambos). Recomiendo usar minúsculas o nombres de variables de mayúsculas y minúsculas como hábito para reducir la posibilidad de colisiones de nombres con variables de shell.
fuente
$
lo que no hay razón para ponerlas en mayúsculas para que se destaquen.if [[ ! $foo =~ bar ]]
más seguro queif ! [[ $foo =~ bar ]]
, porque hace que sea más fácil introducir más condiciones en elif
la forma más segura es poner el! para la negación regex dentro de
[[ ]]
esto:de lo contrario, podría fallar en ciertos sistemas.
fuente
Sí, puede negar la prueba como SiegeX ya ha señalado.
Sin embargo, no debe usar expresiones regulares para esto; puede fallar si su ruta contiene caracteres especiales. Intenta esto en su lugar:
(Fuente)
fuente
Me gusta simplificar el código sin usar operadores condicionales en tales casos:
fuente