Bash 将路径作为参数传递给shell脚本
我编写了bash脚本来打开作为参数传递的文件,并将其写入另一个文件。但我的脚本只有在文件位于当前目录中时才能正常工作。现在,我还需要打开并写入不在当前目录中的文件 如果compile是我脚本的名称,那么Bash 将路径作为参数传递给shell脚本,bash,shell,directory,arguments,Bash,Shell,Directory,Arguments,我编写了bash脚本来打开作为参数传递的文件,并将其写入另一个文件。但我的脚本只有在文件位于当前目录中时才能正常工作。现在,我还需要打开并写入不在当前目录中的文件 如果compile是我脚本的名称,那么/compile next/123/file.txt应该在传递的路径中打开file.txt。我怎么做 #!/bin/sh #FIRST SCRIPT clear echo "-----STARTING COMPILATION-----" #echo $1 name=$1 # Copy the
/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
#/垃圾箱/垃圾箱
#第一稿
清楚的
echo“----开始编译---”
#回声1美元
name=$1#将文件名复制到name
找到-iname$name-maxdepth 1-exec cp{}$name\;
新建文件=“tempwithfile.adb”
cp$name$new#文件复制到new#u文件
回应“编译”
dir>filelist.txt
gcc writefile.c
run\u file=“run\u file.txt”
echo$name>$run\u文件
/a.out
回声“”
回声“清洗”
回声“”
澄清
make-f makefile
./semantizer-da您的代码和问题有点混乱和不清楚
似乎您打算查找
您的文件(作为脚本的参数),但由于最大深度
而失败
如果将next/123/file.txt
作为参数提供给您,则您的find
将向您发出警告:
查找:警告:您已在
非选项参数-iname,但选项不是位置(-maxdepth
影响之前指定的测试以及之后指定的测试
它)。请在其他参数之前指定选项
另外,-maxdepth
为您提供深度find
将查找您的文件,直到文件退出next/123/file.txt
的目录深度为2
您还试图在find
中复制给定的文件,但之后还使用cp
复制了该文件
如前所述,您的代码非常混乱,我不知道您想做什么。如果你能详细说明的话,我很乐意帮忙:)
有一些问题尚未解决:
如果您已经知道该文件的路径,为什么必须查找该文件?你总是把整条路作为一个论据吗?还是仅仅是道路的一部分?只有basename
是否只想将文件复制到其他位置
你的writefile.c
做什么?它是否将您文件的内容写入另一个文件<代码>cp
已经这样做了
我还建议使用大写字母的变量,并检查所用命令(如cp
和find
)的退出状态,以检查这些命令是否失败
无论如何,以下是我的脚本,可能会对您有所帮助:
#!/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
#/垃圾箱/垃圾箱
#第一稿
清楚的
echo“----开始编译---”
echo“文件:$1”
[$#-ne 1]&&echo“用法:$0”1>&2&&exit 1
FILE=“$1”#将文件名复制到name
FILE_NEW=“tempwithfile.adb”
cp“$FILE”“$FILE_NEW”#将文件复制到新文件
[$?-ne 0]&退出2
回声
echo“---[编译]---”
回声
dir&>filelist.txt#列出目录内容并写入filelist.txt
gcc writefile.c#???
FILE\u RUN=“RUN\u FILE.txt”
回显“$FILE”>“$FILE\u运行”
/a.out
回声
回声“---[清洁]---”
回声
澄清
make-f makefile
./semantizer-da
如果您已经知道该文件的路径,为什么要查找该文件?我不想查找该文件。但要打开它(如果存在),并将其写入当前目录中的文件。但正如您在代码中看到的,我将$1复制到name,并将name复制到newfile。它没有按我需要的那样工作。我会解释我的需要。目前我所做的是从终端执行/编译a.adb。a、 adb可以包含从中引用的许多其他文件。所有这些文件目前都需要在当前目录中。c将所有这些文件写入一个文件。我使用“find-iname”来解决文件名的大小写敏感问题。例如,目录可能包含A.adb而不是A.adb。因此,您只获得*.adb
文件的文件名,然后您要在子目录中找到它,请将其复制到当前目录。您的writefile.c
将收集*.adb
文件中的引用文件,并将其写入单个文件。你现在所需要的就是find
来真正找到你给定的adb文件,对吗?如果我给出'/compile../previous/file.txt',它会转到父目录中的file.txt吗?是的,我上面的脚本就是这样做的,但是如果你已经知道它的路径。/previous/file.txt
,那你为什么要找到这个文件呢?当然。如果给定了任何路径(向前或向后),则应找到该文件。此外,所有引用的文件都将位于该目录中,而不是当前目录中。