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