【问题标题】:Copy multiple files with bash script from command line arguments?使用 bash 脚本从命令行参数复制多个文件?
【发布时间】:2015-07-07 23:06:47
【问题描述】:

我想创建一个脚本,允许我从命令行输入多个文件名,并让脚本将这些文件复制到另一个目录。这就是我正在尝试的,但我不断收到

的错误

第 10 行:需要二元运算符

#!/bin/bash

DIRECTORY=/.test_files
FILE=$*
if [ -e $DIRECTORY/$FILE ]; then
        echo "File already exists"
else
        cp $FILE $DIRECTORY
fi

所以如果脚本被命名为 copfiles.sh,我正在写...

./copyfiles.sh doc1.txt doc2.txt

它会移动文件,但如果它们已经存在,它将不会读取错误消息。

此外,无论文件是否存在,我都会收到“第 10 行:预期二进制运算符”错误。谁能告诉我我做错了什么?

【问题讨论】:

  • 创建一个只包含 FILE=$*echo "[ -e $DIRECTORY/$FILE ]" 的新脚本,看看当你使用这些参数运行它时会得到什么。然后看看该错误是否更有意义(并考虑如何正确测试目标目录中的多个文件。
  • 一个很好的 Bash 调试技巧是添加行 set -x 这将导致 bash 在执行之前打印每一行。这样,您将能够看到变量是如何扩展的,以及每行在执行之前的样子。
  • @EtanReisner 我得到 [ -e /test.doc ] 我将脚本命名为 stack.sh,然后运行 ​​./stack.sh test.doc
  • 这不是你最初运行的。使用两个参数会向您显示问题。这就是为什么我说“用这些参数运行它”。

标签: linux bash scripting terminal


【解决方案1】:

作为一个可能的问题,如果您的文件名带有空格或有多个参数,$* 中会包含空格,因此 [ -e $DIR/$FILE ] 将扩展为包含大量单词,例如 [ -e /.test_files/First word and more ]-e 预计只有 1后面的话。尝试将其放在引号中,例如

if [ -e "$DIRECTORY/$FILE" ]

当然,您可能只想将 $1 存储在 $FILE 中以获取第一个参数。

要测试所有要循环的参数并使用类似的东西测试每个参数

for FILE in "$@"; do
    if [ -e "$DIRECTORY/$FILE" ]; then
        echo "$FILE already exists"
    else
        cp "$FILE" $DIRECTORY
    fi
done

在 $@ 周围使用引号来保留原始参数中的空格

【讨论】:

  • 哦,好吧,所以基本上因为 $DIRECTORY 和 $FILE 本质上是两个不同的参数,所以 -e 不会将它们识别为没有引号的单个路径名?
  • $DIRECTORY 和 $FILE 是不同的变量,其中 $FILE 包含脚本的所有参数。当-e 尝试进行检查时,它将用空格分隔它之后的所有内容(嗯,实际上是 $IFS 的内容,但通常是空格)。如果 $FILE 包含的空格会使-e 认为您正在向它传递多个参数,但如果您在它周围加上引号,-e 会知道将所有内容都视为单个参数。我还没有尝试过,但是如果您使用 [[ ... ]]] 而不是带有双括号的 [ ... ] 可能会更聪明。
  • 好的,我明白你在说什么。我唯一没有的问题是“文件已存在”错误只会在我使用一个参数运行脚本时发生。如果我使用多个参数运行它,并且一个或多个文件位于另一个位置,则不会出现错误消息,它就像复制文件一样。
  • 是的,如果您希望每个参数有很多参数,则必须对每个参数进行单独的-e 测试。你想遍历 $* 的变量,而不是尝试一步完成,只用一个 -e 为他们所有
  • 好的,我会努力解决的。非常感谢!编辑:让它工作!
猜你喜欢
  • 2015-05-05
  • 2021-11-25
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
相关资源
最近更新 更多