Você deve remover o \
na frente de :
nesse segundo teste ou tentará corresponder a um caractere% \
literal.
Estas não são correspondências de expressões regulares que você está fazendo, mas o padrão de globalização de shell corresponde (assim como na linha de comando quando você está usando *
em padrões). Isso realmente não importa neste caso.
Suponho que você queira extrair o 20 das duas primeiras strings e armazená-lo em devReadErr
, mas não quando a linha ler READ: DISABLED
. Isso é exatamente o que seu código faz se o \
for removido:
if [[ ${line} == *"RAW_READ_ERROR_RATE"* ]] ||
[[ ${line} == "READ:"* ]] &&
[[ ${line} != *"READ: DISABLED"* ]]; then
devReadErr=$(echo "$line" | awk '{print $2}')
fi
Outra maneira de fazer a mesma coisa:
if [[ "$line" != *'DISABLED' ]]; then
devReadErr=${line##* }
fi
Isso extrai o número como a string após o último caractere de espaço em $line
se a string não terminar com a palavra DISABLED
. Isso evita os echo
e awk
.
Se isso fizer parte de um loop maior que analisa um arquivo linha por linha, sugiro escrevê-lo em awk
ou alguma outra linguagem criada para analisar texto. Veja, por exemplo, Por que usar um loop de shell para processar texto é considerado uma prática ruim? .