我编写了一个简单的bash脚本来从iblocklist.com获取一个归档文件,并将其提取到我的传输阻止列表目录中。在重写脚本之后,我得到了意外的EOF错误,并且我找不到问题所在。我绝对不是bash的高级用户,但我通常可以通过反复试验和google来完成我想要的。不是今天。我已经寻找了明显缺失的}、fi和;,但它对我来说很好。不确定这是否重要,但在这台机器上,我运行的是一个回溯的linux发行版,它或多或少地迫使你始终以root身份。我是一个初学者,所以请温文尔雅:)
#!/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发布于 2013-02-20 00:22:30
问题是您使用}fi来终止if。令牌}fi不是fi。所以在文件末尾的外壳中,有很多打开的if,缺少它们的fi。
您迫切需要阅读shell手册,了解shell语法,并询问您当地的shell专家。所编写的脚本是fubar,即使更正了语法错误。
发布于 2013-02-20 01:09:12
使用现有的大括号是一种稍微不寻常的风格,但它并没有什么问题。然而,shell对空格有点挑剔:
if cmd; then {
: commands
} else {
: other commands
} fi注意}和fi之间的空格。
还有,你工作太辛苦了。不要总是显式地检查$?并编写错误消息,只需做如下操作:
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命令应该已经打印了一个错误消息。如果您打算在命令失败时退出,则可以简化操作,只需执行以下操作:
rm /p/a/t/h || exit 1您还可以通过执行以下操作来进一步简化:
#!/bin/sh -e
rm /p/a/t/h通过设置-e,shell将在任何命令失败时立即退出。
https://stackoverflow.com/questions/14962008
复制相似问题