Как объединить два условия в скрипте bash?

Как объединить два условия в скрипте bash?

Примечание: обновление 28 июня.

У меня есть скрипт iptables.sh (интерпретируемый bash) с правилами:

function run_ips(){
for ip in $(sed '/#.*/d' ips.txt); do
  if echo $ip | grep -q "-" >/dev/null; then
    iptables -A FORWARD -m mac --mac-source $mac -o eth0 -p tcp --dport 443 -m iprange --dst-range "$ip" -j ACCEPT
  else
    iptables -A FORWARD -m mac --mac-source $mac -o eth0 -p tcp --dport 443 -d $ip -j ACCEPT
  fi
done
}
for mac in $(awk -F";" '{print $2}' macs.txt); do
   iptables -t nat -A PREROUTING -i eth1 -m mac --mac-source $mac -p tcp --dport 80 -j REDIRECT --to-port 8080
   iptables -A INPUT -i eth1 -m mac --mac-source $mac -p tcp --dport 8080 -j ACCEPT
   run_ips
done

Где macs.txt содержит MAC-адреса, а ips.txt содержит IP-адреса или диапазоны, разделенные знаком «-».

Ошибка: Другое приложение в настоящее время удерживает блокировку xtables. Возможно, вы хотите использовать опцию -w?

(это генерируется функцией "run_ips")

Как мне объединить обе части?

решение1

Я не вижу необходимости в функции здесь. Если вам нужна функция, возможно, лучше передать переменную как параметр, а не пытаться использовать ее как глобальную переменную. Однако, кажется довольно простым просто вложить циклы:

for mac in $(awk -F";" '{print $2}' macs.txt); do
    iptables -t nat -A PREROUTING -i eth1 -m mac --mac-source $mac -p tcp --dport 80 -j REDIRECT --to-port 8080
    iptables -A INPUT -i eth1 -m mac --mac-source $mac -p tcp --dport 8080 -j ACCEPT
    for ip in $(sed '/#.*/d' ips.txt); do
      if echo $ip | grep -q "-" >/dev/null; then
        iptables -A FORWARD -m mac --mac-source $mac -o eth0 -p tcp --dport 443 -m iprange --dst-range "$ip" -j ACCEPT
      else
        iptables -A FORWARD -m mac --mac-source $mac -o eth0 -p tcp --dport 443 -d $ip -j ACCEPT
      fi
    done
done

Что касается сообщения об ошибке, похоже, что у вас есть процесс, запущенный в то же время, когда обрабатываются эти правила. Возможно, вам следует просто добавить -wв iptables строки, как предполагает ошибка. Эта опция должна заставить iptables ждать снятия блокировки xtables.

Связанный контент