Usando o GNU bash (versão 4.0.35 (1) -release (x86_64-suse-linux-gnu)), eu gostaria de negar um teste com expressões regulares. Por exemplo, gostaria de adicionar condicionalmente um caminho à variável PATH, se o caminho ainda não estiver lá, como em:
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
Tenho certeza de que existem milhões de maneiras de fazer isso, mas o que eu gostaria de saber é se o condicional pode ser negado de alguma forma, como em (o incorreto):
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
fonte
fonte
Você também pode colocar o ponto de exclamação dentro dos colchetes:
mas você deve ancorar seu padrão para reduzir falsos positivos:
que procura uma correspondência no início ou no final com dois pontos antes ou depois dela (ou de ambos). Eu recomendo o uso de nomes de variáveis em minúsculas ou mistas como hábito para reduzir a chance de colisões de nomes com variáveis de shell.
fonte
$
portanto, não há razão para colocá-las em maiúsculas para destacá-las.if [[ ! $foo =~ bar ]]
mais seguro do queif ! [[ $foo =~ bar ]]
, porque facilita a introdução de mais condições para oif
a maneira mais segura é colocar o! para a negação de regex dentro da
[[ ]]
seguinte maneira:caso contrário, poderá falhar em certos sistemas.
fonte
Sim, você pode negar o teste, como o SiegeX já apontou.
No entanto, você não deve usar expressões regulares para isso - pode falhar se o seu caminho contiver caracteres especiais. Tente isso:
(Fonte)
fonte
Eu gosto de simplificar o código sem usar operadores condicionais nesses casos:
fonte