首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用错误检查函数,在我的脚本中使用Bash意外的EOF来wget并提取归档文件

使用错误检查函数,在我的脚本中使用Bash意外的EOF来wget并提取归档文件
EN

Stack Overflow用户
提问于 2013-02-20 00:09:02
回答 2查看 1K关注 0票数 1

我编写了一个简单的bash脚本来从iblocklist.com获取一个归档文件,并将其提取到我的传输阻止列表目录中。在重写脚本之后,我得到了意外的EOF错误,并且我找不到问题所在。我绝对不是bash的高级用户,但我通常可以通过反复试验和google来完成我想要的。不是今天。我已经寻找了明显缺失的}、fi和;,但它对我来说很好。不确定这是否重要,但在这台机器上,我运行的是一个回溯的linux发行版,它或多或少地迫使你始终以root身份。我是一个初学者,所以请温文尔雅:)

代码语言:javascript
复制
#!/bin/bash

function test {
    "$@"
        STATUS=$?
    if [ $STATUS -ne 0 ]; then
        echo "error with $1";
    fi

    return $STATUS
}

function askyn {
    read -p "The operation failed. Try alternate means? [Y/n] " -n 1 -r
    if [[ "$REPLY" =~ ^[Yy] ]] || [[ "$REPLY" = "" ]]; then YN=1;
    else YN=0; fi
    return $YN
}

function cleanup {
    if [ $ALT == 0 ]; then {
        test rm /root/scripts/.lvl1/dl/level1.gz
        if [ $STATUS -ne 0 ]; then {
            echo Removal of archive failed
        }fi
    }else {
        test rm /root/scripts/.lvl1/dl/level1.zip
        if [ $STATUS -ne 0 ]; then {
            echo Removal of archive failed
        }fi
    }fi
    return
}

ALT=0
YN=-1
test wget "http://list.iblocklist.com/?list=bt_level1&fileformat=p2p&archiveformat=gz" -O /root/scripts/.lvl1/dl/level1.gz
if [ $STATUS -ne 0 ]; then { #wget failed first try
    askyn
    if [ $YN == 1 ]; then ALT=1;else exit;fi #prompt for alternate; exit if not
}else { #wget worked first try
    test file-roller -e /root/.config/transmission/blocklists /root/scripts/.lvl1/dl/level1.gz
    if [ $STATUS -ne 0 ]; then { #file-roller failed to extract the list
        askyn
        if [ $YN == 1 ]; then ALT=1;else exit;fi #prompt for alternate; exit if not
    }else { #everything worked first try
        echo Download and extraction successful
        cleanup
    }fi
}fi
if [ $ALT == 1 ]; then { #try to wget .zip
    test wget "http://list.iblocklist.com/?list=bt_level1&fileformat=p2p&archiveformat=zip" -O /root/scripts/.lvl1/dl/level1.zip
    if [ $STATUS -ne 0 ]; then { #wget of .zip failed
        echo Alternate means failed.  Exiting.
        exit
    }else { #wget of .zip worked 
        test unzip -o -d /root/.config/transmission/blocklists /root/scripts/.lvl1/dl/level1.zip #try to unzip .zip
        if [ $STATUS -ne 0 ]; then { #unzip failed
            echo Alternate means failed.  Exiting.
            exit
        }else { #everything worked second try
            echo Download and extraction successful using alternate means
            cleanup
        }fi
    }fi
}fi
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-20 00:22:30

问题是您使用}fi来终止if。令牌}fi不是fi。所以在文件末尾的外壳中,有很多打开的if,缺少它们的fi

您迫切需要阅读shell手册,了解shell语法,并询问您当地的shell专家。所编写的脚本是fubar,即使更正了语法错误。

票数 0
EN

Stack Overflow用户

发布于 2013-02-20 01:09:12

使用现有的大括号是一种稍微不寻常的风格,但它并没有什么问题。然而,shell对空格有点挑剔:

代码语言:javascript
复制
if cmd; then {
    : commands
} else {
    : other commands
} fi

注意}fi之间的空格。

还有,你工作太辛苦了。不要总是显式地检查$?并编写错误消息,只需做如下操作:

代码语言:javascript
复制
if rm /root/scripts/.lvl1/dl/level1.gz; then
    : # perform some commands if the remove succeeded
else
    : # perform some commands on failure, but DO NOT PRINT AN ERROR MESSAGE
fi

不打印错误消息的理由是rm命令应该已经打印了一个错误消息。如果您打算在命令失败时退出,则可以简化操作,只需执行以下操作:

代码语言:javascript
复制
rm /p/a/t/h || exit 1

您还可以通过执行以下操作来进一步简化:

代码语言:javascript
复制
#!/bin/sh -e
rm /p/a/t/h

通过设置-e,shell将在任何命令失败时立即退出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14962008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档