Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将路径作为参数传递给shell脚本_Bash_Shell_Directory_Arguments - Fatal编程技术网

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

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

我编写了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
#/垃圾箱/垃圾箱
#第一稿
清楚的
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
    ,那你为什么要找到这个文件呢?当然。如果给定了任何路径(向前或向后),则应找到该文件。此外,所有引用的文件都将位于该目录中,而不是当前目录中。