需要帮助解决此 shell 脚本的语法错误

需要帮助解决此 shell 脚本的语法错误

我希望它搜索一个文件,如果文件超过 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

答案1

这里有各种问题。首先,您实际上并没有将名称保存为$name。您需要read VARIABLE将输入的字符串保存为$VARIABLE。您也不需要echo但稍后会详细介绍。

现在,您收到的语法错误大概是这样的:

第 6 行:((:wget --spiderhttp://example.com| grep *M >= 250M : 表达式中的语法错误(错误标记是“spiderhttp://example.com| grep *M >= 250M ")

这是因为你使用了非常错误的语法。grep将打印整行,而不仅仅是兆字节数。因此,你实际上是在尝试检查如下行:

Length: 272629760 (260M)

大于250M,这毫无意义。此外,的输出wget --spider被打印到标准错误,而不是标准输出,因此您需要将其重定向到 stdout 才能使用grep它:

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

你还需要过滤掉除了数字本身之外的所有内容。一种方法是使用积极展望,以及-PPerl 兼容正则表达式 (PCRE),并-o告诉grep仅打印行的匹配部分:

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

在 PCRE 中,\d表示任意数字,+表示“一个或多个”。(?=foo)构造正向前瞻仅当下一个字符为 时才会匹配foo。 因此,上述正则表达式将匹配一个或多个数字,后跟字母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."

相关内容