Script shell - os espaços em branco nem sempre são reconhecidos como tal?

0

Estou confuso sobre como o bash interpreta espaços em branco ao executar um script. No final, eu quero um script que é alimentado por um arquivo csv contendo software usado por uma organização e deve retornar os CVEs para esses programas, chamando um script python para buscar essas informações.

Meu arquivo ficaria assim, mas com mais de 500 linhas:

"CRYSTAL REPORTS 2008";"SAP";"reporting software";;"Mr. Smith"

E é alimentado no meu script como

$ getcve.sh < test.csv

Quando executo este pequeno script, recebo resultados estranhos com relação ao wordcount (que eu queria usar para percorrer a saída do script python para armazenar em outro arquivo):

Read from file
Source: CVE-2010-2590 CVE-2010-3032 
Words in variable: 2
CVE-2010-2590 CVE-2010-3032 
Words processed: 1

No entanto, quando codifico "SAP CRYSTAL REPORTS 2008" no script, a contagem muda para o que eu esperaria:

 Hardcoded query
 Query: "SAP CRYSTAL REPORTS 2008"
 Source: CVE-2010-2590 CVE-2010-3032
 Words in variable: 2
 CVE-2010-2590
 CVE-2010-3032
 Words processed: 2

O script em si é assim:

#!/bin/bash
clear
echo "Hardcoded query"
query='"SAP CRYSTAL REPORTS 2008"'
echo "Query: "$query
var2=$(python3 $HOME/cve-search/bin/search_fulltext.py -q "$query"  | tr '\n' ' ')
echo "Source: "$var2
i=0
echo "Words in variable: "$(echo "$var2"|wc -w)
for cve in $var2
do
    echo $cve
    i=$[ $i+1 ]
done
echo "Words processed: "$i

echo
echo "Read from file"
IFS_OLD=$IFS
IFS=";"
while read title firm desc version manager
do
    query='"'$(echo $firm $title $version | tr -d '"')'"'
    var3=$(python3 $HOME/cve-search/bin/search_fulltext.py -q "$query" | tr '\n' ' ')
    echo "Source: "$var3
    i=0
    echo "Words in variable: "$(echo "$var3"|wc -w)
    for cve in $var3
    do
        echo $cve
        i=$[ $i+1 ]
    done
    echo "Words processed: "$i
done
IFS=$IFS_OLD

Existe algum truque ou método para obter os mesmos resultados que a consulta codificada ao ler um arquivo?

Eu tropecei nisso brincando um pouco (o shell script é novo para mim) e esse resultado estranho está me incomodando ^^ "

Agradeço antecipadamente por sua ajuda:)

    
por AaA 07.01.2016 / 15:20

2 respostas

2

Seu problema vem de IFS=";" , eu acho: essa modificação terá um impacto no loop for.

Tente:

IFS_OLD=$IFS
IFS=";"
while read title firm desc version manager
do
    query='"'$(echo $firm $title $version | tr -d '"')'"'
    var3=$(python3 $HOME/cve-search/bin/search_fulltext.py -q "$query" | tr '\n' ' ')
    echo "Source: "$var3
    i=0
    echo "Words in variable: "$(echo "$var3"|wc -w)
    IFS=" "
    for cve in $var3
    do
        echo $cve
        i=$[ $i+1 ]
    done
    IFS=";"
    echo "Words processed: "$i
done
IFS=$IFS_OLD
    
por 07.01.2016 / 15:41
0

Se você colocar uma string com espaços em uma variável, ela será expandida para um valor quando usada como for i in $var3 . No entanto, quando você usar echo $var3 , a saída conterá os espaços e wc -w contará isso.

Você precisa modificar o seu loop para

for cve in $(echo $var3)

para que o valor seja reavaliado e os espaços façam com que o valor seja dividido em palavras discretas.

    
por 07.01.2016 / 15:41