2014-12-19 3 views
0

У меня есть небольшой скрипт 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 
+3

Использование http://www.shellcheck.net/ – Cyrus

ответ

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

Если вы систематическая в вашем отступа, вы заметили проблему:

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.

Смежные вопросы