Ler arquivo linha por linha e colocar em outra string

2

Eu quero ler o arquivo linha por linha e colocar seu conteúdo em outra string em um lugar específico. Eu criei o script abaixo, mas não consegui colocar o conteúdo do arquivo nessa string.

Arquivo: cat / testing / spamword

spy
bots
virus

Script:

#!/bin/bash

file=/testing/spamword

cat $file | while read $line;

do

echo 'or ("$h_subject:" contains "'$line'")'

done

Saída:

or ("$h_subject:" contains "")

or ("$h_subject:" contains "")

or ("$h_subject:" contains "")

A saída deve ser como:

or ("$h_subject:" contains "spy")
or ("$h_subject:" contains "bots")
or ("$h_subject:" contains "virus")
    
por blaCkninJa 26.11.2016 / 11:28

2 respostas

5

O primeiro problema é que você está usando while read $var . Essa é a sintaxe incorreta, pois $var significa "o valor da variável var". O que você quer é while read var . Então, as variáveis são apenas expandidas entre aspas duplas, não as únicas, e você está tentando lidar com isso, mas de uma maneira desnecessariamente complexa. Você também codifica o nome do arquivo, o que geralmente não é uma boa ideia. Por fim, por uma questão de estilo, tente evitar o UUoC . Colocando tudo isso junto, você pode fazer:

#!/bin/bash

file="$1"    
## The -r ensures the line is read literally, without 
## treating backslashes specially, so without expanding
## things like '\t'. 
while read -r line;
do
    ## By putting the whole thing in double quotes, we 
    ## ensure that variables are expanded and by escaping 
    ## the $ in the 1st var, we avoid its expansion. 
    echo "or ('\$h_subject:' contains '$line')"
done < "$file"

Observe que é geralmente melhor o uso de printf em vez de echo . E, neste caso, torna as coisas mais simples, já que você pode substituir o echo acima por:

printf 'or ("$h_subject:" contains "%s")\n' "$line" 

Salve isso como foo.sh . torne-o executável e execute-o com o arquivo como um argumento:

./foo.sh /testing/spamword
    
por 26.11.2016 / 12:16
3

use assim

echo "or (\$h_subject: contains $line)"

você não deve usar $ line enquanto ... melhor você pode usar o código abaixo.

#!/bin/bash

file=/testing/spamword
while read line;
do
echo "or (\"\$h_subject:\" contains \"$line\")"
done < ${file}
    
por 26.11.2016 / 11:33