2013-02-24 4 views
1

J'ai essayé de trouver la réponse sur ceci et d'autres forum. Ce qui suit est un script bash censé exécuter une séquence de commandes dans une boucle for. Je lis dans 2 colonnes d'un fichier. La première colonne a une liste de noms de fichiers (FARR) et la seconde un paramètre - un numéro (NARR) utilisé dans le traitement. Il exécutera l'ensemble des commandes pour chaque fichier dans FARR et utilisera le nom de fichier et le paramètre dans la commande commençant après "faire". Tout fonctionne comme prévu, sauf que $ {NARR [$ N]} n'ajoute pas le paramètre à la fin de la ligne. Le paramètre est vide à ce stade. L'utilisation de echo $ NARR affiche la liste complète. Donc, les données sont là ... Toute aide sera grandement appréciée.Passer la variable en tant qu'index au tableau de bash

#!/bin/bash 

DIR='gauss_data/' 
declare -i N=0 
FARR=$(cat $DIR'all.dat' | awk '{if (NR!=1) print $1}') 
NARR=$(cat $DIR'all.dat' | awk '{if (NR!=1) print $2}') 
for f in $FARR; 
do 
    ./gauss_and_noise.py -i $DIR$f -o $DIR$f'.out' -d --save $DIR$f'.out.plot.png' --n0 ${NARR[$N]} 
    let "N++" 
done 
+2

Vous semblez être familier avec Python. Je réécrirais ce script bash en Python si j'étais toi. – piokuc

+0

** Astuce: ** Ajouter 'set -x' sous la ligne shebang est une aide précieuse pour le débogage des scripts [tag: bash]. – Johnsyweb

+0

J'aurais pu le faire en python, mais je m'apprends à écrire des scripts bash et cela me semble être un bon candidat. –

Répondre

3

Vous dites NARR est un tableau, mais vous donnez une valeur de chaîne

peut-être changer à ce

NARR=($(awk 'NR>1 {print $2}' "$DIR"all.dat)) 
+0

Merci. Cela a fait l'affaire. –

1

En outre, itérer sur un tableau, utilisez la syntaxe suivante:

for f in "${FARR[@]}" 
0

Vous pouvez tout simplement ce qui a grandement en utilisant un while boucle et la commande read. Le read avant la boucle est là pour consommer la première ligne du fichier d'entrée sans l'utiliser. Il n'y a pas besoin de tableaux; il suffit d'utiliser chaque ligne d'entrée comme vous l'avez lu.

dir='gauss_data' 
declare -i N=0 
{ 
    read 
    while read f n rest; do 
     ./gauss_and_noise.py -i "$dir/$f.out" -d \ 
          --save "$dir/$f.out.plog.png" --n0 $n 
     ((n++)) 
    done 
} < $dir/all.dat 
Questions connexes