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展开一个变量时,他将其中包含的引号视为普通字符,而不再是告诉他将单词组合在一起的符号……没错,就是这样!你解释得比我好。