Linux 是否使用bash脚本从命令行参数复制多个文件?

Linux 是否使用bash脚本从命令行参数复制多个文件?,linux,bash,scripting,terminal,Linux,Bash,Scripting,Terminal,我想创建一个脚本,允许我从命令行输入多个文件名,并让脚本将这些文件复制到另一个目录。这是我正在尝试的,但我不断得到一个错误 第10行:应为二进制运算符 #!/bin/bash DIRECTORY=/.test_files FILE=$* if [ -e $DIRECTORY/$FILE ]; then echo "File already exists" else cp $FILE $DIRECTORY fi 所以如果脚本名为copfiles.sh,我正在写

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

第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行:预期的二进制运算符”错误,不管文件是否存在。有人能告诉我我做错了什么吗?

作为一个可能的问题,如果你有一个带有空格的文件名或有多个参数,$*会有空格,所以
[-e$DIR/$FILE]
会扩展为有很多单词,比如
[-e/.test\u files/第一个单词和更多单词]
,而
-e
只需要后面有一个单词。试着用引号括起来,比如

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

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

创建一个新脚本,该脚本只包含
FILE=$*
echo“[-e$DIRECTORY/$FILE]”
并查看使用这些参数运行脚本时得到的结果。然后看看这个错误是否更有意义(并考虑如何正确测试目标目录中的多个文件。Bash的一个很好的调试技巧是添加一行
set-x
,这将使Bash在执行前打印每一行。这样,您就可以看到变量是如何扩展的,以及每一行在执行前的具体外观。@EtanReisner I get[-e/test.doc]我将脚本命名为stack.sh,并运行了./stack.sh test.doc。这不是您最初运行的脚本。使用两个参数会向您显示问题。这就是为什么我说“使用这些参数运行它”.Ohhh好的,既然$DIRECTORY和$FILE本质上是两个不同的参数,-e在没有引号的情况下不会将它们识别为一个路径名?$DIRECTORY和$FILE是不同的变量,$FILE包含您的scrip的所有参数。当
-e
尝试进行检查时,它将分离所有出现的参数如果$FILE包含的空格会使
-e
认为您正在向它传递多个参数,但是如果在其周围加上引号,
-e
将知道将所有内容都视为单个参数。我没有尝试过,但如果您使用
[…]]
用双括号代替
[…]
可能更聪明。好吧,我明白你的意思。我唯一没有的问题是“文件已经存在”仅当我使用一个参数运行脚本时才会发生错误。如果我使用多个参数运行脚本,并且一个或多个文件位于另一个位置,则不会出现错误消息,它只会像复制了文件一样。对,如果希望每个参数都有大量参数,则必须对每个参数进行单独的
-e
测试s、 你想循环使用$*的变量,而不是一步一个
-e
,对他们来说,allOkay,我会努力解决的。非常感谢!编辑:成功了!