bash スクリプトで 2 つの条件を結合するにはどうすればよいですか?

bash スクリプトで 2 つの条件を結合するにはどうすればよいですか?

注: 6月28日更新

次のルールを含む iptables script.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 ロックが解放されるまで待機するはずです。

関連情報