2017-04-16 2 views
-1

J'essaye d'écrire un script bash, mais il y a un problème - je ne peux pas voir le contenu de la variable en dehors de do-done. De l'aide?Linux extrait des valeurs de bash scipt

#!/bin/bash 

file="ip.txt" 

while IFS=: read -r f1 f2 f3 
do 
    printf '%s %s %s\n' "$f1" "$f2" "$f3" 
done <"$file" 

printf '%s %s %s\n' "$f1" "$f2" "$f3" 

echo -e "iptables -t nat -A PREROUTING -p tcp --dport $f2 -j DNAT --to-destination $f1:$f3" 

Sortie>

192.168.0.1 
2000 
1000 

iptables -t nat -A PREROUTING -p tcp --dport -j DNAT --to-destination : 
+0

Pouvez-vous vérifier votre sortie? Je pense que les 3 valeurs '192.168.0.1 2000 1000' sont sur une ligne. –

+0

'read' affecte chaque variable à la chaîne vide de la lecture finale. Cette valeur vide est entièrement visible pour votre script! (Juste pas particulièrement utile) –

Répondre

0

Je peux voir votre problème avec

while IFS=: read -r f1 f2 f3 
do 
    printf 'Loop: %s %s %s\n' "$f1" "$f2" "$f3" 
done <<< "192.168.0.1:2000:1000" 
printf 'After: %s %s %s\n' "$f1" "$f2" "$f3" 

Vous avez fait une construction où vous pouvez utiliser les vars qui ont été définies dans la boucle, mais pas la VARS fixé par lire. Vous pouvez utiliser

while IFS=: read -r xf1 xf2 xf3 
do 
    printf 'Loop: %s %s %s\n' "$xf1" "$xf2" "$xf3" 
    f1=$xf1 
    f2=$xf2 
    f3=$xf3 
done <<< "192.168.0.1:2000:1000" 
printf 'After: %s %s %s\n' "$f1" "$f2" "$f3" 

Je suppose que vous ne voulez pas utiliser celui-ci, alors lisez la ligne dans la boucle:

while read -r line 
do 
    IFS=: read -r f1 f2 f3 <<< "${line}" 
    printf 'Loop: %s %s %s\n' "$f1" "$f2" "$f3" 
done <<< "192.168.0.1:2000:1000" 
printf 'After: %s %s %s\n' "$f1" "$f2" "$f3" 
1

est-il pas le problème que vous avez une ligne vide à la fin de votre fichier, et donc $ f1 $ f2 f3 $ devient vide à la dernière itération de la la boucle?

+0

Ne devrait pas être dans ce cas ** deux ** lignes de sortie vides entre * 1000 * et * iptables .... *? La première ligne de sortie vide doit provenir de 'printf' à l'intérieur de la boucle, où la ligne d'entrée supposée vide est lue, et la seconde proviendrait de' printf' après la boucle. – user1934428

+0

@voyvoda: Pour vérifier l'idée de JohanThomsen, changez votre 'printf' dans la boucle en quelque chose comme' printf 'f1 =% s f2 =% s f3 =% s \ n' "$ f1" "$ f2" "$ f3" ', pour que vous puissiez mieux voir quand vous avez une entrée vide – user1934428

0

Son comportement bash connu. Lisez ici, pourquoi et comment éviter: http://mywiki.wooledge.org/BashPitfalls#grep_foo_bar_.7C_while_read_- ou http://mywiki.wooledge.org/BashFAQ/024

+1

Ces liens s'appliquent à un scénario différent de celui de la question. Ceux-ci décrivent le 'cmd | alors que vous lisez ... 'stuff; cela ne s'applique pas ici. –

+0

Je reste corrigé, je n'ai pas regardé assez attentivement. Ressemble similaire dans le résultat, mais a une cause différente. – ULick