我希望它搜索一个文件,如果文件超过 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 ...
你还需要过滤掉除了数字本身之外的所有内容。一种方法是使用积极展望,以及-P
Perl 兼容正则表达式 (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."