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

时间:2014-06-21 12:38:51

标签: 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 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

1 个答案:

答案 0 :(得分:1)

您的代码和您的问题有点混乱且不清楚。

您似乎打算将find文件作为脚本的参数提供,但由于maxdepth而失败。

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

  

find:warning:你在a之后指定了-maxdepth选项   非选项参数-iname,但选项不是位置(-maxdepth   影响之前指定的测试以及之后指定的测试   它)。请在其他参数之前指定选项。

同样-maxdepth会为您提供深度find,直到它退出后才会找到您的文件。 next/123/file.txt的深度为2个目录。

此外,您尝试复制find中的给定文件,但之后也使用cp复制了该文件。

如上所述,您的代码非常混乱,我不知道您要做什么。如果你能详细说明,我很乐意帮忙。)。

有一些问题是开放的:

  1. 为什么你必须find该文件,如果你已经知道它的路径?你总是把整条路径作为一个论点吗?或者只是路径的一部分?只有basename
  2. 您只是想将文件复制到其他位置吗?
  3. 您的writefile.c做了什么?它是否将您的文件内容写入另一个文件? cp已经做到了。
  4. 我还建议使用带有CAPITALIZED字母的变量,并检查所用命令的退出状态,例如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