if [ '`echo "$url" | grep (\.tar\.gz|\.tar\.bz2|\.zip|\.rar|\.7z)$`' ] ; then
语法错误,我只想检查文件扩展名。
答案 0 :(得分:4)
首先,您需要删除''
,否则测试只是一个总是求值为true的字符串。您需要将正则表达式放在引号中,因为括号由bash解释。您还需要使用egrep
(相当于grep -E
)。
if [ `echo "$url" | egrep "(\.tar\.gz|\.tar\.bz2|\.zip|\.rar|\.7z)$"` ] ; then
您还可以通过将.
分解出组并将tar.{gz,bz2}
分组来缩短正则表达式:
if [ `echo "$url" | egrep "\.(tar\.(gz|bz2)|zip|rar|7z)$"` ] ; then
对于将来,请注意bash给出的错误,告诉你很多:bash: syntax error near unexpected token (
表示错误在(
附近,我刚刚向您展示的正是在哪里错误在于。
Jonathan's answer提供了有关改进测试的更多提示。
答案 1 :(得分:3)
假设:
if [ '`echo "$url" | grep (\.tar\.gz|\.tar\.bz2|\.zip|\.rar|\.7z)$`' ] ; then
本身,这不是语法错误 - 任何语法错误都可能在附近。
另一方面,这也不是你想要的。方括号之间的字符串是单引号;它本身就是。测试检查字符串是否为空(不是)并继续执行then
子句中的代码。
您需要使用以下内容:
if [ $(echo "$url" | grep -E '\.(tar\.gz|tar\.bz2|zip|rar|7z|tgz)$' ) ] ; then
$(...)
”作为反向标记。grep -E
”激活扩展正则表达式。.tgz
'是gzipped tar文件的有效(尽管很少见)扩展。然后,正如Dennis在评论中指出的那样,您可以观察到根本没有必要使用测试命令或命令替换:
if echo "$url" | grep -E '\.(tar\.gz|tar\.bz2|zip|rar|7z|tgz)$' >/dev/null ; then
这将检查管道的退出状态,即grep
的退出状态,如果其中一个后缀被识别,则为0(成功),如果没有,则为1(失败)。然后,如果这是我们正在使用的Bash,你也可以避开管道:
if grep -E '\.(tar\.gz|tar\.bz2|zip|rar|7z|tgz)$' <<< "$url" >/dev/null ; then
我们也可以通过重写代码来使用case
语句来避免使用第二个进程:
case "$url" in
(*.tar.gz|*.tar.bz2|*.zip|*.rar|*.7z|*.tgz|*.xz)
# Do what was in the 'then' clause
;;
(*) # Do what was in the 'else' clause
;;
esac
.xz
也是您可能遇到的压缩方案。答案 2 :(得分:0)
请改为尝试:
grep -E '\.(tar\.gz|tar\.bz2|zip|rar|7z)$'