语法错误:意外的文件结束

时间:2014-12-19 05:59:32

标签: bash bash4

我在这里有一个小的bash脚本我正在尝试修复但是我一直收到语句错误,指出“意外的文件结束”。它询问我是否要阻止或解除阻塞并询问哪种类型的端口然后出错。

非常感谢任何帮助。

#!/bin/bash

PTYPET="What kind of port? [udp] or [tcp] or [both] :"
PTEXTT="What port? [number] :"

echo "Would you like to block or unblock? [b] or [u] :"
read choice

if [ $(choice) == "u" ]; then
    echo $PTYPET
    read port-type
    echo $PTEXTT
    read port
    if [ $(ptype-text) == "both" ]; then
        /sbin/iptables -A INPUT -p $port-type -m tcp --dport $port -j ACCEPT
        /sbin/iptables -A INPUT -p $port-type -m udp --dport $port -j ACCEPT
    else
    /sbin/iptables -A INPUT -p $port-type -m $port-type --dport $port -j ACCEPT
fi

else 
    echo $PTYPET
    read port-type
    echo $PTEXTT
    read port
    if [ $(ptype-text) == "both" ]; then
        /sbin/iptables -A INPUT -p $port-type -m tcp --dport $port -j DROP
        /sbin/iptables -A INPUT -p $port-type -m udp --dport $port -j DROP
    else
    /sbin/iptables -A INPUT -p $port-type -m $port-type --dport $port -j DROP
fi

2 个答案:

答案 0 :(得分:1)

以不同的方式解决它。

#!/bin/bash

echo "Would you like to block or unblock? [ACCEPT] or [DROP] :"
    read choice
echo "What kind of port? [udp] or [tcp] or [both] :"
    read porttype
echo "What port? [number] :"
    read port

    if [[ $porttype == "both" ]]; then
        /sbin/iptables -A INPUT -p tcp -m tcp --dport $port -j $choice
        /sbin/iptables -A INPUT -p udp -m udp --dport $port -j $choice
    else
    /sbin/iptables -A INPUT -p $porttype -m $porttype --dport $port -j $choice
fi

答案 1 :(得分:1)

如果你的缩进系统性,你会发现问题:

if [ $(choice) == "u" ]; then
    echo $PTYPET
    read port-type
    echo $PTEXTT
    read port
    if [ $(ptype-text) == "both" ]; then
        /sbin/iptables -A INPUT -p $port-type -m tcp --dport $port -j ACCEPT
        /sbin/iptables -A INPUT -p $port-type -m udp --dport $port -j ACCEPT
    else  # Indent next two lines
        /sbin/iptables -A INPUT -p $port-type -m $port-type --dport $port -j ACCEPT
    fi
else 
    echo $PTYPET
    read port-type
    echo $PTEXTT
    read port
    if [ $(ptype-text) == "both" ]; then
        /sbin/iptables -A INPUT -p $port-type -m tcp --dport $port -j DROP
        /sbin/iptables -A INPUT -p $port-type -m udp --dport $port -j DROP
    else  # Indent the next two lines
        /sbin/iptables -A INPUT -p $port-type -m $port-type --dport $port -j DROP
    fi
# And now it is clear that this fi was missing!
fi

经典地,port-type不是有效的变量名;下划线就行了。使用$(ptype-text)正在运行命令ptype-text并捕获输出,这有点令人惊讶;与$(choice)类似。对于变量引用,使用大括号:${choice}。你在代码中有一些相当明显的重复。两对“echo / read”应该在if/else结构之外。

相关问题