2010-08-06 4 views
0

J'ai un programme java pour lequel j'essaie de générer 3 sorties, puis je les renomme en fonction de ce que le fichier d'entrée a été appelé à l'origine.Utilisation de Bash pour automatiser la création de sorties de test

Le problème est que seul le fichier d'entrée est en cours de déplacement. Je pense que cela pourrait être un problème concernant les commandes de fichiers relatifs.

Voici mon script. (De plus, je suis ouvert à des suggestions pour améliorer ce script mieux regarder. Je suis un débutant bash.)

#!/bin/bash 
######################################################## 
#This script compiles Main, then attempts to run each # 
#test case. After running a test case, it renames the # 
#testcase and moves it to a new directory.    # 
######################################################## 
#echo `pwd` <---- This was used for testing. pwd is correct 

#Gets contents of "tests" directory, stores them into the array 
#without the file extension. 
list=(`ls tests| sed 's/\.txt$//g'`) 

#Compiles Main.java 
cd ./src 
javac Main.java 
cd '../' 
mv -f src/*.class bin #*/ (formatting fix) 

#Runs Main for each test case, then renames and moves the test cases. 
for filename in ${list[@]} 
do 
echo 1 > input.txt 
echo tests/$filename.txt >> input.txt 
cd ./bin # Why do I need to cd to make this work? 
java bin/Main < input.txt 
cd ../ 
mv -f input.txt "scriptout/'$filename'_input.txt" 
mv -f "tests/output.txt" "scriptout/'$filename'_output.txt" 
mv -f "tests/listing.txt" "scriptout/'$filename'_listing.txt" 
mv -f "src/intermediate.txt" "scriptout/'$filename'_intermediate.txt" 
done 
+0

ici est ma structure de répertoire: CVS scriptSortie essais bin src testscript.sh – MikeKusold

+1

Êtes-vous rencontrez un problème avec ce script que vous êtes à la recherche d'une solution pour? –

+0

@Geoffrey: Du deuxième paragraphe de la question: "Le problème est que seul le fichier d'entrée est déplacé." –

Répondre

0

Vous avez des guillemets simples autour de vos noms de variables. Comme ils sont entre guillemets doubles, les variables seront étendues mais les guillemets simples seront inclus dans les noms de fichiers. Essayez ceci:

mv -f input.txt "scriptout/${filename}_input.txt" 

Les accolades protégeront le nom de la variable d'être combiné avec les caractères suivants.

Vous pouvez le faire:

list=(tests/*) 
list=("${list[@]##*/}") # strip dirname 
list=("${list[@]%.*}")  # strip extension 

Ceux-ci empêchent les erreurs s'il y a des espaces dans l'un des noms de fichiers.

Utilisez indenter pour rendre votre script plus lisible:

for ... 
do 
    command 
done 

En général, vous devriez éviter d'utiliser des répertoires relatifs et utiliser une variable comme base pour un répertoire absolu:

basedir=/path/to/base 
do_something $basedir/test/filename 
mv $basedir/subdir1/file1 $basedir/subdir2 

Cela peut Aussi faites en sorte que vous n'avez pas besoin d'utiliser cd autant.

Vous recevez des messages d'erreur? Essayez d'utiliser set -x pour activer le suivi et set +x pour l'éteindre. Placez-les avant et après certaines sections de code afin de voir ce qui se passe dans cette zone.

+0

Merci beaucoup pour les conseils! Je l'ai fonctionné maintenant. – MikeKusold

Questions connexes