bash 将路径作为参数传递给 shell 脚本
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/24341686/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Passing a path as an argument to a shell script
提问by Hymanzz
I've written bash script to open a file passed as an argument and write it into another file. But my script will work properly only if the file is in the current directory. Now I need to open and write the file that is not in the current directory also.
我已经编写了 bash 脚本来打开作为参数传递的文件并将其写入另一个文件。但是只有当文件在当前目录中时,我的脚本才能正常工作。现在我还需要打开并写入不在当前目录中的文件。
If compile is the name of my script, then ./compile next/123/file.txt
should open the file.txt
in the passed path. How can I do it?
如果 compile 是我的脚本的名称,那么./compile next/123/file.txt
应该file.txt
在传递的路径中打开。我该怎么做?
#!/bin/sh
#FIRST SCRIPT
clear
echo "-----STARTING COMPILATION-----"
#echo
name= # 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
采纳答案by polym
Your code and your question are a bit messy and unclear.
您的代码和您的问题有点混乱和不清楚。
It seems that you intended to find
your file, given as a parameter to your script, but failed due to the maxdepth
.
您似乎打算将find
文件作为脚本的参数提供,但由于maxdepth
.
If you are given next/123/file.txt
as an argument, your find
gives you a warning:
如果你被next/123/file.txt
当作一个论点,你find
会给你一个警告:
find: warning: you have specified the -maxdepth option after a non-option argument -iname, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.
find: 警告:您在非选项参数 -iname 之后指定了 -maxdepth 选项,但选项不是位置性的(-maxdepth 影响在它之前指定的测试以及在它之后指定的测试)。请在其他参数之前指定选项。
Also -maxdepth
gives you the depth find
will go to find your file until it quits. next/123/file.txt
has a depth of 2
directories.
还-maxdepth
为您提供了深度find
会去找到你的文件,直到它退出。next/123/file.txt
具有2
目录深度。
Also you are trying to copy the given file within find
, but also copied it using cp
afterwards.
此外,您正在尝试在 中复制给定的文件find
,但也使用cp
之后复制它。
As said, your code is really messy and I don't know what you are trying to do. I will gladly help, if you could elaborate :).
如上所述,您的代码真的很乱,我不知道您要做什么。如果您能详细说明,我很乐意提供帮助:)。
There are some questions that are open:
有一些问题是开放的:
- Why do you have to
find
the file, if you already know its path? Do you always have the whole path given as an argument? Or only part of the path? Only thebasename
? - Do you simply want to copy a file to another location?
- What does your
writefile.c
do? Does it write the content of your file to another?cp
does that already.
find
如果您已经知道文件的路径,为什么还要访问该文件?您是否总是将整个路径作为参数给出?还是只是路径的一部分?只有basename
?- 您只是想将文件复制到另一个位置吗?
- 你是
writefile.c
做什么的?它是否将您的文件内容写入另一个?cp
已经这样做了。
I also recommend using variables with CAPITALIZED letters and checking the exit status of used commands like cp
and find
, to check if these failed.
我还建议使用带有 CAPITALIZED 字母的变量并检查所用命令的退出状态,例如cp
和find
,以检查这些命令是否失败。
Anyway, here is my script that might help you:
无论如何,这是我的脚本可能会对您有所帮助:
#!/bin/sh
#FIRST SCRIPT
clear
echo "-----STARTING COMPILATION-----"
echo "FILE: "
[ $# -ne 1 ] && echo "Usage: ##代码## <file>" 1>&2 && exit 1
FILE="" # 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