【问题标题】:Passing a path as an argument to a shell script将路径作为参数传递给 shell 脚本
【发布时间】:2014-08-12 01:30:06
【问题描述】:

我编写了 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 复制到 name 并将 name 复制到 newfile。它没有按我的需要工作。

标签: bash shell directory arguments


【解决方案1】:

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

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

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

find: 警告:您在 a 之后指定了 -maxdepth 选项 非选项参数 -iname,但选项不是位置的(-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。
  • 所以你只得到了你的*.adb文件的文件名,然后你想在子目录中找到它,把它复制到当前目录。您的writefile.c 将收集您的*.adb 文件中的引用文件并将它们写入单个文件。你现在只需要find 来实际找到你给定的 adb 文件,对吗?
  • 如果我给'./compile ../previous/file.txt',会不会转到父目录下的file.txt??
  • 好吧,我上面的脚本就是这样做的,但是如果你已经知道它的路径../previous/file.txt,为什么还要找到文件呢?
  • 当然。如果给出了任何路径,无论是向前还是向后,都应该找到该文件。此外,所有引用的文件都将在该目录中,而不是在当前目录中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2021-01-11
  • 2019-10-22
  • 1970-01-01
相关资源
最近更新 更多