2010-03-20 22 views
0

J'ai un script bash qui lit l'entrée d'un fichier comme celui-ci:Bash: comment traiter les variables d'un fichier d'entrée?

while IFS="|" read -r a b 
do 
    echo "$a something $b somethingelse" 
done < "$FILE" 

Le fichier qu'il lit looketh comme ceci:

http://someurl1.com|label1 
http://someurl2.com|label2 

Cependant, je voudrais être en mesure de insérer les noms des variables dans ce fichier quand il me convient, et ont le processus de script eux quand il les voit, le fichier pourrait ressembler à ceci:

http://someurl1.com?$VAR|label1 
http://someurl2.com|label2 

alors $VAR pourrait être, par exemple, la date d'aujourd'hui, produisant une sortie comme ceci:

http://someurl1.com something label1 somethingelse 
http://someurl2.com?20100320 something label2 somethingelse 
+1

Mais ce ne serait pas input produit une date avant label1 et pas avant label2? – DigitalRoss

+0

Oui, mais c'est OK. Je veux ajouter une variable à certaines lignes, pas toutes. – user187150

Répondre

2

Vous pourriez trouver this page utile. Pour l'exemple que vous avez donné, essayez:

while IFS="|" read -r a b 
do 
    repl=`date +%Y%m%d` 
    a=${a/\$VAR/$repl} 
    echo "$a something $b somethingelse" 
done < "$FILE" 

... mais si le format de fichier ou la langue que vous utilisez ne sont pas gravées dans la pierre, il pourrait y avoir de meilleures alternatives;)

1

Vous cherchez quelque chose comme ceci?

FILE=vexp.in 
VAR=20100320 
while IFS="|" read -r a b 
do 
    eval echo "$a something $b somethingelse" 
done < "$FILE" 
+0

'eval' devrait être évité pour des raisons de sécurité et ceci est un exemple particulièrement bon. La réponse de ** miorel ** montre un moyen de réduire les choses pour ne gérer que les entrées attendues. –

+1

Les scripts shell doivent être évités pour des raisons de sécurité, mais nous les utilisons tout le temps. Toutes les questions impliquent une vulnérabilité d'injection de code, et la réponse de miorel, bien que raisonnable, présente l'inconvénient de ne développer qu'une seule variable spécifique et reste vulnérable aux exploits de shell génériques, elle ne devrait donc pas être utilisée dans un contexte de sécurité. – DigitalRoss

0

Pour un général solution qui va remplacer toute variable d'environnement (ainsi que d'exécuter un code, donc ne pas utiliser si vous ne contrôlez pas les variables ou désinfectez l'entrée), utilisez eval:

while IFS="|" read -r a b 
do 
    eval a=$a 
    eval b=$b 
    echo "$a something $b somethingelse" 
done < "$FILE"