【问题标题】:Strange behaviour of find when passing variable parameters传递可变参数时find的奇怪行为
【发布时间】:2014-11-26 10:36:25
【问题描述】:

我创建了一个名为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 并显示它。

我知道不转义空格字符是不好的做法,但是谁能解释一下这里发生了什么?为什么第二个命令不起作用?

【问题讨论】:

    标签: bash find quotes quoting


    【解决方案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
    

    【讨论】:

    • 因此,传递带引号的变量参数的唯一方法(就像我在没有变量的情况下键入整个命令一样)是用它们包围变量:“$s”,否则它们会变成普通字符,对吗?
    • 嗯,我不知道我是否明白你的意思。您必须注意的是不要过度引用:) 您要查找的名称是foo bar,而不是"foo bar",因此像这样分配它。也就是说,如果您正在寻找 foo bar 的东西,只需正常分配变量 var="foo bar",以便引号仅指示变量是 foo bar。然后,使用带双引号的find 确保变量被解释为一个完整且唯一的字符串:find "$var"
    • 好的,谢谢。我的意思是(如果我理解的话)当 Bash 扩展一个变量时,他将其中包含的引号视为普通字符,而不是告诉他将单词组合在一起的符号。..
    • 没错,就是这样!你解释得比我好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多