PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash: Problem mit for Schleife



lobo
13-04-2003, 17:15
Hi.

Ich hab hier ein Problem mit einer "for" Schleife. "for" verarbeitet Worte der Reiche nach, was auch mein Problem ist. In der Variable $RULES stehen 3 Firewall Regeln, welche der Reihe nach abgearbeitet werden müssten. Hat jemand ne Idee wie man das in einem Shell Script regeln könnte? Wenn es nicht möglich ist, dann werde ich auf Perl ausweichen, da ist das ja kein Problem, aber als Shell-Script wäre es mir lieber.



#!/bin/sh

IPTABLES="/sbin/iptables"
RULES="INPUT -i ppp0 -p tcp --dport 443 -j ACCEPT
FORWARD -p tcp --dport 443 -j ACCEPT
PREROUTING -t nat -i ppp0 -p tcp --dport 443 -j DNAT --to-destination 192.168.1.3"

case "$1" in
'load')
for RULE in ${RULES}; do
echo "${IPTABLES} -A ${RULE}"
done;
;;
'unload')
for RULE in ${RULES}; do
echo "${IPTABLES} -D ${RULE}"
done;
;;
esac


Gruss

Jochen

phate
14-04-2003, 09:42
Hi lobo,

die bash verarbeitet in Schleifen wie der deinigen Eingaben wortweise. Die Festlegung was dabei als Wort angesehen wird, geschieht über die Variable IFS (InterFieldSeperator?). Standardmässig beinhaltet IFS alle Arten von Leerzeichen (Space, Tab, Newline). Siehe auch http://www.gnu.org/manual/bash-2.05a/html_node/bashref_33.html

Willst Du nun Deine Eingabe in Wörter aufsplitten, die den Zeilen entsprechen musst Du IFS entsprechend auf Newline setzen und Deine Rules dann aber auch nur durch jeweils ein Newline trennen.
#!/bin/sh

IFS='
'

RULES="INPUT -i ppp0 -p tcp --dport 443 -j ACCEPT
FORWARD -p tcp --dport 443 -j ACCEPT
PREROUTING -t nat -i ppp0 -p tcp --dport 443 -j DNAT --to-destination 192.168.1.3"

for rule in $RULES; do
...
done


Den Wert für IFS gibst Du dabei so ein, wie Du ihn auch in Deinem Eingabetext fabrizierst, d.h. durch die Eingabe von Enter.

lobo
14-04-2003, 18:20
Vielen Dank ;-)

Ich glaube ich sollte mal die Bash-Doku lesen.