Bash 我怎样才能粘贴;“我的目录/*.class”;到cp?

Bash 我怎样才能粘贴;“我的目录/*.class”;到cp?,bash,shell,escaping,quotes,Bash,Shell,Escaping,Quotes,我有一个shell脚本,它应该将所有类文件从一个目录复制到另一个目录(然后稍后对这些文件执行其他操作)。问题是目录中可能包含空格,一旦我在参数周围添加引号(“”),则*.class无法解析。我有这样的想法: #!/bin/bash # the source directory is stored in $1 # create temp dir to copy files into tmp_dir=$(mktemp -d) # copy files: cp "$1/*.class" "tmp

我有一个shell脚本,它应该将所有类文件从一个目录复制到另一个目录(然后稍后对这些文件执行其他操作)。问题是目录中可能包含空格,一旦我在参数周围添加引号(“”),则*.class无法解析。我有这样的想法:

#!/bin/bash

# the source directory is stored in $1

# create temp dir to copy files into
tmp_dir=$(mktemp -d)

# copy files:
cp "$1/*.class" "tmp_dir"
我得到一个错误,“my directory/*.class”不是文件或目录。如果我手动运行此命令:

cp my\ directory/*.class
一切正常。但如果我运行此操作(无论是手动还是通过脚本),它都会失败:

cp "my directory/*.class"
我已经试着用
替换
,但是没有用


如何解析
*.class
,或者如何转义参数以使其生效?

不要引用通配符本身:

tmpdir=$(mktemp -d)
cp -- "$1"/*.class "$tmpdir"

引用变量而不是
*
“$1”/*.class
@EtanReisner有更好的答案,但是你也可以采取另一个步骤来避开空格。类似
cp$(echo$1 | sed's/\\\/g')/*。class$TMP\u DIR
@MicahSmith,不,这不起作用(因为扩展结果直接用于字符串拆分;不会对它们进行语法分析,例如转义字符)。有关更多详细信息,请参见BashFAQ#50:顺便说一句,如果您没有导出
TMP#u DIR
,最好使用小写名称,以清楚地表明您没有试图覆盖环境变量
TMPDIR
(默认情况下有几个程序使用该变量)。使用
tmpdir
作为名称可以避免歧义。@CharlesDuffy这只是一个例子,我通常使用小写变量。我将编辑我的问题