синтаксическая ошибка: неожиданный конец файла

У меня есть небольшой сценарий 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

person Zac1989    schedule 19.12.2014    source источник
comment
Используйте shellcheck.net.   -  person Cyrus    schedule 19.12.2014


Ответы (2)


Поступил по-другому.

#!/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
person Zac1989    schedule 19.12.2014

Если вы систематически делаете отступы, вы обнаружите проблему:

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}. У вас есть довольно заметные повторы в коде. Две пары «эхо / чтение» должны находиться за пределами структуры if/else.

person Jonathan Leffler    schedule 19.12.2014