Precisa de ajuda com este script de shell recebendo erro de sintaxe

0

Eu gostaria que isso fosse pesquisado por um arquivo e, se ultrapassar 250M, faça o download. Se não, não baixe.

echo "Name your file."
read
echo "Paste the url you wish to check below."
read url
if (( wget --spider $url | grep *M >= 250M ));
then wget -O $name $url
else echo "This is not what you are looking for."
fi
    
por John Shocknesse 14.10.2015 / 07:20

1 resposta

3

Existem vários problemas aqui. Primeiro, você não está salvando o nome como $name . Você precisa read VARIABLE para salvar a string digitada como $VARIABLE . Você também não precisa do echo , mas mais sobre isso depois.

Agora, o erro de sintaxe que você está recebendo é, presumivelmente, este:

% bl0ck_qu0te%

Isso porque você está usando uma sintaxe muito errada. O grep imprimirá a linha inteira, não apenas o número em megabytes. Portanto, você está realmente tentando verificar se uma linha como esta:

Length: 272629760 (260M)

é mais do que 250M e isso não faz sentido. Além disso, a saída de wget --spider é impressa no erro padrão, não na saída padrão, portanto, é necessário redirecioná-la para stdout para grep it:

wget --spider $url 2>&1 | grep ...

Você também precisa filtrar tudo, exceto o número em si. Uma maneira de fazer isso é com uma lookahead positiva e -P para expressões regulares compatíveis com Perl (PCRE) e -o para informar grep para imprimir apenas a parte correspondente da linha:

grep -oP '\d+(?=M)'

No PCRE, \d significa qualquer dígito e + significa "um ou mais". A construção (?=foo) , a antecipação positiva, corresponderá somente se os próximos caracteres forem foo . Assim, o regex acima corresponderá a um ou mais dígitos, seguido pela letra M .

Portanto, uma versão funcional (e ligeiramente melhorada) do seu script seria:

#!/usr/bin/env bash

read -p "Name your file: " name
read -p "Paste the url you wish to check: " url

if (( $(wget --spider $url 2>&1 | grep -oP '\d+(?=M)') > 250 ));
then
    wget -O $name $url
else
    echo "This is not what you are looking for."
fi

Ou, para uma sintaxe mais compacta que faça o mesmo:

#!/usr/bin/env bash

read -p "Name your file: " name
read -p "Paste the url you wish to check: " url

(( $(wget --spider $url 2>&1 | grep -oP '\d+(?=M)') > 250 )) &&
    wget -O $name $url ||  echo "This is not what you are looking for."
    
por terdon 14.10.2015 / 14:48