regex - siguientes - if expresiones regulares bash
¿Cómo puedo negar una prueba con expresiones regulares en un script bash? (5)
Usando 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 no está ya 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 hacerlo, pero lo que me gustaría saber es si el condicional puede ser negado 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
¡Gracias!
Lo hiciste bien, ¡solo pon un espacio entre el !
y el [[
como if ! [[
if ! [[
Me gusta simplificar el código sin usar operadores condicionales en tales casos:
TEMP=/mnt/silo/bin
[[ ${PATH} =~ ${TEMP} ]] || PATH=$PATH:$TEMP
También puede poner el signo de admiración dentro de los corchetes:
if [[ ! $PATH =~ $temp ]]
pero debe anclar su patrón para reducir los falsos positivos:
temp=/mnt/silo/bin
pattern="(^|:)$temp(:|$)"
if [[ ! $PATH =~ $pattern ]]
que busca una coincidencia al principio o al final con dos puntos antes o después (o ambos). Recomiendo usar nombres de variables minúsculas o mixtas como hábito para reducir la posibilidad de colisiones de nombres con variables de shell.
la forma más segura es poner el! para la negación de expresiones regulares dentro de [[ ]]
como esta:
if [[ ! ${STR} =~ YOUR_REGEX ]]; then
de lo contrario, podría fallar en ciertos sistemas.