Você poderia fazer:
#! /bin/sh -
while [ "$#" -ge 2 ]; do
proto=$1 port=$2
shift 2
iptables --append INPUT --protocol "$proto" --destination-port "$port" \
--match state --state NEW --jump ACCEPT || exit 1
done
com zsh :
#! /bin/zsh -
for proto port do
iptables --append INPUT --protocol "$proto" --destination-port "$port" \
--match state --state NEW --jump ACCEPT || exit 1
done
Uma diferença é que, se houver um número ímpar de argumentos, haverá uma execução extra com $proto contendo o último argumento e $port sendo definido, mas vazio (como se tivéssemos usado [ "$#" -gt 0 ] em vez de [ "$#" -ge 2 ] no exemplo anterior).