我目前正在尝试制作一个 bash 脚本,该脚本将进入 ./中的每个文件夹并编译 blah.java,然后运行 blah 发送一个数字作为输入,并将输出放在我命名的文件中。我有一些功能,但它只进入第一个目录,之后它对我来说失败了。我目前有...
#! /bin/bash
for i in $(find . -maxdepth 1 -type d)
do
pwd
cd $i
pwd
if [ -f "blah.java" ];
then
javac -cp . blah.java
echo "17" | java -cp . blah - > blahresult17
echo "43" | java -cp . blah - > blahresult43
fi
done
我认为它有问题,因为它一旦进入子目录就试图从 ./进入目录,但显然从子目录中它不存在。
你的if上缺少一个fi,但这可能是一个剪切和粘贴错误,而不是你失败的根源。 可能的问题是,一旦你做了第一个cd,下面的cd命令是相对于你过去的位置,而不是你现在的位置。 您可以使用 pushd/popd 来解决此问题,或者在子 shell 中运行 cd 和 java 位,以便 cd 不会持续到下一个循环迭代。
您cd
到目录中,但永远不会cd
出它。
我的建议:使用pushd
/popd
而不是cd
。
将cd $i
替换为pushd "$i"
,并将popd
放在循环的末尾。
此外,for dir in */
迭代当前目录中所有目录的更简单的解决方案。
通过一次javac调用编译所有文件,这是另一种方法,它允许javac处理依赖关系:
SRC=`find src -name "*.java"`
if [ ! -z $SRC ]; then
javac -classpath $CLASSPATH -d obj $SRC
# stop if compilation fails
if [ $? != 0 ]; then exit; fi
fi