views:

50

answers:

1

I have a java program that I am trying to generate 3 outputs for, and then rename them depending on what the input file was originally called.

The problem is that only the input file is being moved. I think this might be an issue regarding relative file commands.

Here is my script. (Also, I'm open to suggestions on making this script better looking. I'm a bash newbie.)

#!/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
A: 

You have single quotes around your variable names. Since they're inside double quotes, the variables will be expanded but the single quotes will be included in the filenames. Try this:

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

The braces will protect the variable name from being combined with following characters.

You can do this:

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

These will prevent errors if there are spaces in any of the filenames.

Use indenting to make your script more readable:

for ...
do
    command
done

In general, you should avoid using relative directories and use a variable as a base for an absolute directory:

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

This can also make it so you don't have to use cd as much.

Are you getting any error messages? Try using set -x to turn on tracing and set +x to turn it off. Place those before and after particular sections of code so you can see what's happening in that area.

Dennis Williamson
Thanks a ton for the tips!I got it working now.
Vasto