[Shell] Executer des commandes en provenance d'une liste

Executer des commandes en provenance d'une liste [Shell] - Shell/Batch - Programmation

Marsh Posté le 23-09-2014 à 12:48:15    

Bonjour
 
Pour simplifier des demandes, j'essaie de créée un script, qui prend en paramètre un fichier, contenant une liste de commande a executer.
J'arrive a lire le fichier, ligne par ligne, sans soucis.
Par contre, je n'arrive pas a faire comprendre a mon script, que les lignes, sont des commades a lancés.
a chaque fois j'ai des erreur de paramètre pas reconu, ou des erreur not found.
 
exemple tout bete, avec un fichier qui contient des echo:

Code :
  1. $>cat test.com
  2. echo "Bonjour"
  3. echo -e "\t Ca va ?"


 
quand je fais la boucle suivante :  

Code :
  1. for trait in $(cat test.com)
  2. do
  3. $trait
  4. done


 
J'ai ces erreurs :

Code :
  1. ksh[3]: "Bonjour":  not found
  2. ksh[3]: -e:  not found
  3. ksh[3]: "\t:  not found
  4. ksh[3]: Ca:  not found
  5. ksh[3]: va:  not found
  6. ksh[3]: ?":  not found


 
La c'etait pour l'exemple, mais en réalité les commandes sont des shell avec des paramètres
j'ai essayer avec `$trait`ou $($trait), ca n'a pas changer grand chose (à part les erreurs)
 
Comment faire comprendre à mon script que ce sont des commandes, avec des paramètres, a executé ?


---------------
Serveur HFR - OpenTTD
Reply

Marsh Posté le 23-09-2014 à 12:48:15   

Reply

Marsh Posté le 23-09-2014 à 13:59:24    

L'erreur est ultra classique. Je l'ai vue un million de fois.
 
Pour lire un fichier ligne à ligne, il ne faut jamais faire : for trait in $(cat test.com)
 
En effet in ne s'arrête pas seulement à la fin d'une ligne, mais aussi quand il voit un espace.
Donc, cela ne peut marcher que dans le cas où une ligne ne contient qu'un seul mot.
 
La solution consiste à faire : cat test.com | while read trait

Reply

Marsh Posté le 25-09-2014 à 07:00:07    

effectivement, j'y pense jamais a cette alternative.
Trop l'habitude de traiter des listes simple.
 
Merci :)


---------------
Serveur HFR - OpenTTD
Reply

Marsh Posté le 26-09-2014 à 11:32:59    

Tu peux aussi changer la variable IFS avant le for ... in et le restaurer ensuite

Code :
  1. OLD_IFS=${IFS}
  2. IFS="
  3. "
  4. #Le script avec la boucle
  5. IFS=${OLD_IFS}


---------------
sheep++
Reply

Marsh Posté le 27-09-2014 à 06:40:28    

l'IFS j'evite d'y toucher, uen fois en le modifiant pour des test ca a fait tomber des script en prod, donc bon, j'evite.


---------------
Serveur HFR - OpenTTD
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed