Нуждаюсь в помощи с этим сценарием оболочки, получая синтаксическую ошибку

Я хотел бы, чтобы это искало файл и если это по 250M, затем загружают его. Если не не загружают его.

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
0
задан 14 October 2015 в 08:25

1 ответ

Здесь существуют различные проблемы. Во-первых, Вы на самом деле не сохраняете имя как $name. Вы nead read VARIABLE сохранить вводимую строку как $VARIABLE. Вам также не нужно echo но больше на этом позже.

Теперь, синтаксическая ошибка, которую Вы получаете, является, по-видимому, этим:

строка 6: ((: wget - паук http://example.com | grep *M> = 250M: синтаксическая ошибка в выражении (ошибочный маркер является "пауком http://example.com | grep *M> = 250M"),

Поэтому Вы используете очень неправильный синтаксис. grep распечатает всю строку, не только число на мегабайтах. Поэтому Вы на самом деле пытаетесь проверить ли строка как это:

Length: 272629760 (260M)

больше, чем 250M и это не имеет никакого смысла. Кроме того, вывод wget --spider печатается к стандартной погрешности, не стандартному выводу, таким образом, необходимо перенаправить его к stdout чтобы к grep это:

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

Также необходимо отфильтровать все кроме самого числа. Один способ сделать это с положительным предвидением, и -P для Perl совместимых регулярных выражений (PCRE) и -o сказать grep только распечатать часть соответствия строки:

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

В PCRE, \d средства любая цифра и + означает "один или несколько". (?=foo) создайте, положительное предвидение, будет только соответствовать, если следующие символы будут foo. Так, regex выше будет соответствовать одной или нескольким цифрам, сопровождаемым буквой M.

Так, работа (и немного улучшенный) версия Вашего сценария была бы:

#!/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

Или, для более компактного синтаксиса, который делает то же самое:

#!/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."
3
ответ дан 28 July 2019 в 11:48

Другие вопросы по тегам:

Похожие вопросы: