Bash 传递变量参数时find的奇怪行为

Bash 传递变量参数时find的奇怪行为,bash,find,quotes,quoting,Bash,Find,Quotes,Quoting,我创建了一个名为foo-bar(使用命令touch-foo\bar)的文件 然后,在Bash中,我尝试了以下命令: s='"foo bar"'; find $s s='"foo bar"'; find "$s" s="foo bar"; find "$s" 对于第一个文件,find查找名为“foo的文件,然后查找名为bar”的文件 对于第二个文件,find查找名为“foo bar”的文件 两个命令都失败:find找不到任何文件 最后,第三个命令具有预期的行为:find查找foo-bar,并显示

我创建了一个名为
foo-bar
(使用命令
touch-foo\bar
)的文件

然后,在Bash中,我尝试了以下命令:

s='"foo bar"'; find $s
s='"foo bar"'; find "$s"
s="foo bar"; find "$s"
对于第一个文件,
find
查找名为
“foo
的文件,然后查找名为
bar”
的文件

对于第二个文件,
find
查找名为
“foo bar”
的文件

两个命令都失败:
find
找不到任何文件

最后,第三个命令具有预期的行为:
find
查找
foo-bar
,并显示它

我知道不逃离太空角色是不好的做法,但有人能解释一下这里发生了什么吗?为什么第二个命令不起作用

我知道不逃避空间角色是不好的做法,但可以 有人给我解释一下这是怎么回事吗第二个为什么不呢 指挥工作?

因为您正在寻找一种叫做
“foo bar”
的东西。你引用的太多了:)

说:

s='"foo bar"'
您指出变量
$s
实际上是
“foo bar”
。也就是说,引号属于变量内容

  • 当你说:

    find "$s"
    
    $ s='"foo bar"'; find $s
    find: ‘"foo’: No such file or directory
    find: ‘bar"’: No such file or directory
    
您正在尝试查找那些文件,这些文件的名称正好是带有引号的
“foo bar”
。然后,如果我们创建一个具有此确切名称的文件,它将工作:

$ touch '"foo bar"'
$ s='"foo bar"'; find "$s"
"foo bar"
  • 当你说:

    find "$s"
    
    $ s='"foo bar"'; find $s
    find: ‘"foo’: No such file or directory
    find: ‘bar"’: No such file or directory
    
你实际上是在说:

$ find \"foo bar\"
find: ‘"foo’: No such file or directory
find: ‘bar"’: No such file or directory
也就是说,您正在使用
find
和两个参数:
“foo
bar”
。这两个文件都不存在。但是,再一次,如果你创造了其中一个,瞧

$ touch '"foo'
$ find \"foo bar\"
"foo
find: ‘bar"’: No such file or directory
注意
find X Y
的行为是查找
X
Y

$ find a b
find: ‘a’: No such file or directory
find: ‘b’: No such file or directory

因此,传递带引号的变量参数的唯一方法(就像我键入的是整个没有变量的命令)是将变量用引号括起来:“$s”,否则它们会变成普通字符,对吗?嗯,我不知道我是否理解你的意思。您必须小心的是不要过度引用:)您要查找的名称是
foobar
,而不是
“foobar”
,因此请按如下方式分配它。也就是说,如果您要查找的是
foobar
,只需正常地分配变量
var=“foobar”
,以便引号仅指示变量是
foobar
。然后,使用带有双引号的
find
确保变量被解释为一个完整且唯一的字符串:
find“$var”
。好的,谢谢。我的意思是(如果我理解的话)当Bash展开一个变量时,他将其中包含的引号视为普通字符,而不再是告诉他将单词组合在一起的符号……没错,就是这样!你解释得比我好。