这些工作如广告所示:
grep -ir 'hello world' .
grep -ir hello\ world .
这些不:
argumentString1="-ir 'hello world'"
argumentString2="-ir hello\\ world"
grep $argumentString1 .
grep $argumentString2 .
Despite 'hello world'
在第二个示例中用引号引起来,grep 解释'hello
(and hello\
) 作为一个参数并且world'
(and world
)作为另一个,这意味着,在这种情况下,'hello
将是搜索模式并且world'
将是搜索路径。
同样,只有当参数从argumentString
变量。 grep 正确解释'hello world'
(and hello\ world
) 作为第一个示例中的单个参数。
谁能解释这是为什么吗?是否有一种正确的方法来扩展字符串变量,以保留每个字符的语法,以便 shell 命令可以正确解释它?
Why
当字符串扩展时,它会被分割成单词,但不会重新评估它以查找特殊字符,例如引号或美元符号或...这是 shell“始终”的行为方式,因为 Bourne shell 返回1978年左右。
Fix
In bash
,使用数组来保存参数:
argumentArray=(-ir 'hello world')
grep "${argumentArray[@]}" .
或者,如果勇敢/鲁莽,请使用eval
:
argumentString="-ir 'hello world'"
eval "grep $argumentString ."
另一方面,谨慎往往是勇气的重要组成部分,并且与eval
这是一个谨慎胜过勇敢的地方。如果你不能完全控制字符串eval
'd(如果命令字符串中存在任何未经严格验证的用户输入),那么您将面临潜在的严重问题。
请注意,Bash 的扩展顺序在外壳扩展在 GNU Bash 手册中。请特别注意 3.5.3 Shell 参数扩展、3.5.7 分词和 3.5.9 引号删除部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)