将路径作为参数传递给Shell脚本

3
我编写了一个Bash脚本,用于打开以参数形式传递的文件并将其写入另一个文件。但是,如果文件不在当前目录中,我的脚本只能正常工作。现在我需要打开并写入不在当前目录中的文件。
如果我的脚本名为"compile",那么"./compile next/123/file.txt"应该打开传递路径中的file.txt。我该怎么办?
#!/bin/sh
#FIRST SCRIPT
clear
echo "-----STARTING COMPILATION-----"
#echo $1
name=$1   # Copy the filename to name
find . -iname $name -maxdepth 1 -exec cp {} $name \;
new_file="tempwithfile.adb"
cp $name $new_file #copy the file to new_file

echo "compiling"
dir >filelist.txt
gcc writefile.c
run_file="run_file.txt"
echo $name > $run_file
./a.out
echo ""
echo "cleaning"
echo ""

make clean
make -f makefile
./semantizer -da <withfile.adb

如果你已经知道文件的路径,为什么还要去找它呢? - polym
我不是在尝试找到文件。而是要打开它(如果存在),并将其写入当前目录中的文件。但正如您在代码中看到的那样,我正在将$1复制到名称,然后将名称复制到newfile。它并不能按照我的需求工作。 - Jackzz
1个回答

2

你的代码和问题有点混乱并且不清晰。

看起来你打算使用给定的参数查找文件,但由于 maxdepth, 导致失败。

如果以 next/123/file.txt 作为参数,你的 find 将会给出一个警告:

find: 警告:您已在非选项参数 -iname 之后指定了 -maxdepth 选项,但选项不是位置相关的(-maxdepth 影响到它之前或之后指定的测试)。请在其他参数之前指定选项。

-maxdepth 决定了 find 查找文件目录的深度。 next/123/file.txt 在目录结构中的深度为 2

此外,你试图在 find 中复制给定的文件,但还使用了 cp 进行复制。

正如所说,你的代码非常混乱,我不知道你在尝试做什么。如果你能更具体一些,我很乐意提供帮助 :)

以下是一些问题:

  1. 如果你已经知道文件的路径,为什么还要使用 find 查找文件?你是否总是使用完整路径作为参数?或者只有部分路径?只有 basename ?
  2. 你只是想将文件复制到另一个位置吗?
  3. 你的 writefile.c 做什么?它将文件内容写入另一个文件中吗?cp 已经实现了这个功能。

我建议使用大写字母的变量,并检查所使用的命令的退出状态,比如 cpfind, 以检查它们是否失败。

以下是可能会对你有帮助的脚本:

#!/bin/sh
#FIRST SCRIPT
clear
echo "-----STARTING COMPILATION-----"
echo "FILE: $1"
[ $# -ne 1 ] && echo "Usage: $0 <file>" 1>&2 && exit 1

FILE="$1"   # Copy the filename to name
FILE_NEW="tempwithfile.adb"
cp "$FILE" "$FILE_NEW" # Copy the file to new_file
[ $? -ne 0 ] && exit 2

echo
echo "----[ COMPILING ]----"
echo
dir &> filelist.txt # list directory contents and write to filelist.txt
gcc writefile.c # ???

FILE_RUN="run_file.txt"
echo "$FILE" > "$FILE_RUN"

./a.out

echo
echo "----[ CLEANING ]----"
echo

make clean
make -f makefile
./semantizer -da < withfile.adb

谢谢。我将解释我的需求。目前我所做的是,从终端执行./compile a.adb。a.adb可能包含许多其他文件引用它。所有这些文件现在都需要在当前目录中。writefile.c将所有这些文件写入单个文件中。我已经使用“find -iname”来解决文件名大小写敏感性的问题。例如,目录中可能包含A.adb而不是a.adb。 - Jackzz
是的,我的上面的脚本可以做到这一点,但如果您已经知道文件的路径“../previous/file.txt”,为什么还要查找该文件呢? - polym
因为从writefile.c中,我需要访问那些不在当前目录下的其他目录里的文件。那么我该怎么做呢?目前我的做法是,当*.adb被引用时,我会检查它是否在filelist.txt中。如果是,我会打开并写入它。现在如果文件在其他目录中,我还需要修改我的filelist.txt对吗? - Jackzz
你可以将 writefile.c 的编译可执行文件作为参数传递文件名,例如 ./a.out "$FILE",并在 writefile.c 中访问它。 - polym
抱歉,我没有明白。传递什么给.exe?编译完成后怎样访问它? - Jackzz
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接