Existem vários problemas com o seu script. Eu listei os que encontrei, mas não testei, pode haver outros.
for keyurl in $DATA; do …
divide $DATA
em cada espaço em branco, não em cada nova linha. Portanto, na primeira iteração, $DATA
será Example
; então Domains;www.example.com
e assim por diante. Além disso, cada valor é submetido à expansão de curinga, portanto, se houver um *
em uma palavra-chave, você poderá ver resultados funky dependendo dos arquivos presentes no diretório atual.
Você é tring para processar dados separados por nova linha . Uma maneira simples é
while read -r keyurl; do
…
done <testurls
Isso tira o recuo de cada linha, o que provavelmente não é uma coisa ruim aqui. (Use IFS= read -r keyurl
se quiser que keyurl
contenha cada linha exatamente).
Suas chamadas para awk
não estão funcionando porque você está passando $keyurl
como um nome de arquivo. Você precisa passá-lo como entrada. Enquanto você está nisso, sempre use aspas duplas em torno de substituições de variáveis (caso contrário, o shell executa algumas expansões em seu valor). Também recomendo usar $(…)
em vez de '…'
; eles são os mesmos, exceto que '…'
é difícil de usar quando você quer citar coisas dentro, enquanto a sintaxe de $(…)
é intuitiva.
keyword='echo "$keyurl" | awk -F ";" '{print $1}''
url='echo "$keyurl" | awk -F ";" '{print $2}''
Existe uma maneira melhor de dividir uma variável no primeiro ponto-e-vírgula: use as construções internas do shell para remover um prefixo ou sufixo de uma string.
keyword=${keyurl%%;*} url=${keyurl#*;}
Mas como seus dados vêm do read
integrado e o separador é um único caractere, você pode aproveitar o recurso IFS
e dividir sua entrada diretamente à medida que você o lê.
while IFS=';' read -r keyword url; do …
Chegando às suas chamadas curl e grep, observe que você está procurando pelo texto literal $keyword
, já que usou aspas simples. Use aspas duplas; Observe que a palavra-chave será interpretada como uma expressão regular básica . Se você quiser que a palavra-chave seja interpretada como uma string literal, passe a opção -F
para grep
. Você também deve colocar -e
antes do padrão, caso a palavra-chave comece com o caractere -
(caso contrário, a palavra-chave será interpretada como uma opção para o grep). Finalmente, no tópico grep, sua opção -q
é equivalente a >/dev/null
. Lembre-se também das aspas duplas em torno de $url
.
curl -silent "$url" | grep -Fqe "$keyword"
Você pode encurtar a parte if [ $? != 0 ]; then
colocando o comando diretamente aqui.
if curl -silent "$url" | grep -Fqe "$keyword"; then
Em resumo,
while IFS=';' read -r keyword url; do
if curl -silent "$url" | grep -Fqe "$keyword"; then
echo "Did not find $keyword on $url"
else
echo $url "Okay"
fi
done