使用Bash自动创建测试输出

时间:2010-08-06 18:01:22

标签: java bash relative-path

我有一个java程序,我试图为其生成3个输出,然后根据最初调用的输入文件重命名它们。

问题是只移动了输入文件。我认为这可能是关于相对文件命令的问题。

这是我的脚本。 (另外,我愿意接受关于让这个脚本更好看的建议。我是一个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

1 个答案:

答案 0 :(得分:0)

您的变量名称周围有单引号。由于它们在双引号内,变量将被扩展,但单引号将包含在文件名中。试试这个:

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

大括号将保护变量名称不与后续字符组合。

你可以这样做:

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

如果任何文件名中有空格,这些将防止错误。

使用缩进使您的脚本更具可读性:

for ...
do
    command
done

通常,您应该避免使用相对目录并使用变量作为绝对目录的基础:

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

这也可以使您不必使用cd

您收到任何错误消息吗?尝试使用set -x启用跟踪,set +x启用跟踪功能。放置特定代码段之前和之后的那些代码,以便您可以看到该区域中发生的情况。