Comparando duas strings juntas

0

Eu tenho um array chamado sev[w] onde w varia de 1 a 21.
a matriz contém o seguinte:

CRITICAL 
INFORMATIONAL 
CRITICAL 
INFORMATIONAL 
INFORMATIONAL 
INFORMATIONAL 
CRITICAL 
CRITICAL 
INFORMATIONAL 
INFORMATIONAL 
CRITICAL 
INFORMATIONAL 
INFORMATIONAL 
INFORMATIONAL 
INFORMATIONAL 
INFORMATIONAL 
INFORMATIONAL 
INFORMATIONAL 
INFORMATIONAL 
INFORMATIONAL 
INFORMATIONAL 

Eu devo comparar a string e imprimir shte

if [ "${sev[0]}" == CRITICAL ]
 then 
    echo "shte"
fi

sev[0] tem CRITICAL armazenado nela
No entanto, não funciona.
Obrigado pela ajuda!

EDIT
O código bashscript .
As mibwithtraps .

    
por SamFlynn 17.06.2015 / 08:01

3 respostas

2

Suponho que seu arquivo mibwithtraps foi criado usando o Windows e, portanto, tem \r\n finais de linha. Isso quebraria seu roteiro:

$ printf 'foo\r\n' | while read a; do 
    [[ "$a" == "foo" ]] && echo 'Matches!' || echo 'No match!'; 
done
No match!

Como você pode ver acima, o \r está incluído na variável, portanto, ele não corresponde a menos que você inclua no teste:

$ printf 'foo\r\n' | while read a; do 
    [[ "$a" == "foo"$'\r' ]] && echo 'Matches!' || echo 'No match!';
 done
Matches!

Isso é algo que você sempre precisa levar em conta ao lidar com arquivos criados em outro sistema operacional. Uma maneira simples de verificar é passar a primeira linha do seu arquivo por od -c . Fazendo isso no texto do seu pastebin (precisa baixar o original, copiar / colar não vai funcionar), eu recebo:

$ head -1 dmvHuedP.asc | od -c
0000000       a   d   a   p   t   e   c   .   m   i   b   ,   s   C   S
0000020   I   S   m   a   r   t   1   ,   .   1   .   3   .   6   .   1
0000040   .   4   .   1   .   7   9   5   .   2   .   5   .   0   .   1
0000060   0   1   ,   C   R   I   T   I   C   A   L   ,  \r  \n
0000076

Então, o \r foi de fato o problema. Da próxima vez, você pode usar dos2unix para removê-los:

$ head -1 dmvHuedP.asc | dos2unix | od -c
0000000       a   d   a   p   t   e   c   .   m   i   b   ,   s   C   S
0000020   I   S   m   a   r   t   1   ,   .   1   .   3   .   6   .   1
0000040   .   4   .   1   .   7   9   5   .   2   .   5   .   0   .   1
0000060   0   1   ,   C   R   I   T   I   C   A   L   ,  \n
0000075

Basta executar

dos2unix file > newfile

Como alternativa, você pode usar ferramentas padrão do UNIX:

tr -d  '\r' < file > newfile
sed -i 's/\r//g' file
    
por terdon 17.06.2015 / 11:31
2

A sintaxe correta é:

if [[ "${sev[1]}" == "CRITICAL" ]]; then
   echo "shte"
fi

Dê uma olhada no Guia avançado de script de script: matrizes

ATUALIZAÇÃO:

Eu faço um teste. Eu acho que você sente falta dos números de array sev 1 não é crítico, é INFORMATIVO. sev [0] ainda tem CRÍTICO e não vazio

Aqui um teste simples:

sev=( CRITICAL INFORMATIONAL )

if [[ "${sev[0]}" == "CRITICAL" ]]; then    echo "shte"; fi

saída é:

 shte

Agora:

if [[ "${sev[1]}" == "CRITICAL" ]]; then    echo "shte"; fi

a saída está vazia

    
por Maythux 17.06.2015 / 08:08
1

Como seu comentário , você provavelmente teve algum personagem estranho em algum lugar do seu script .

A solução mais direta neste caso, ter o arquivo de entrada e o script foram postados em paste.ubuntu.com e depois de terem sido limpos após o upload, como eu sugeri você nos comentários e como você fez é excluir mibwithtraps e bashscript recriando-os copiando e colando a versão em paste.ubuntu.com.

    
por kos 17.06.2015 / 08:16