为什么 shell 会忽略通过变量传递给它的参数中的引号字符? [复制]

2023-12-10

这些工作如广告所示:

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(使用前将#替换为@)

为什么 shell 会忽略通过变量传递给它的参数中的引号字符? [复制] 的相关文章

随机推荐