传递变量参数时查找的奇怪行为

时间:2014-11-26 10:36:26

标签: 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并显示它。

我知道不要逃避太空人物是不好的做法,但任何人都能解释我这里发生了什么吗?为什么第二个命令不起作用?

1 个答案:

答案 0 :(得分:1)

  

我知道不要逃避太空人物是不好的做法,但可以   有谁解释我这里发生了什么? 为什么不是第二个   指挥工作?

因为您正在寻找名为"foo bar"的内容。你引用太多了:))

说:

s='"foo bar"'

您表明变量$s实际上是"foo bar"。也就是说,变量内容中的引号属于

  • 当你说:

    find "$s"
    

您正在尝试使用引号查找名称正好为"foo bar"的文件。然后,如果我们创建一个具有这个名称的文件,它将起作用:

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

    $ 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与两个参数一起使用:"foobar"。这些文件都不存在。但是,再次,如果你创建其中之一,瞧!

$ touch '"foo'
$ find \"foo bar\"
"foo
find: ‘bar"’: No such file or directory

请注意find X Y的行为是寻找XY

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