当我调用shell_exec
并传递正则表达式时,我的php脚本有问题。
PHP代码:
shell_exec("sh myscript.sh 'FOOs*ONE'");
myscript.sh :
result=$(grep -c "${1}" myLongFile.txt)
echo ${result}
像这样,它返回0
但是如果 il 直接使用 cmd 调用grep -c "FOOs*ONE" myLongFile.txt
它会返回23
.
如果我在我的 php 脚本中替换s
的类[[:space:]]
它就可以工作了,但我必须使用s
我尝试了许多解决方案,但失败了。
您必须使用其他转义
字符,因此它变为:
shell_exec("sh myscript.sh 'FOO\s*ONE'");
您需要转义反斜杠:
shell_exec("sh myscript.sh 'FOO\s*ONE'");
谢谢大家,
我找到了解决方案,我只是在我的脚本中为 grep 添加选项 -P,如下所示:
result=$(grep -P -c "${1}" myLongFile.txt)
现在,我可以使用\s
-P, --perl-regexp 将 PATTERN 解释为 Perl 正则表达式。
问题不在于转义,而仅仅是因为grep
是基于 POSIX 的; 这就是为什么你应该使用 [[:space:]]
而不是 s
。某些版本的grep
支持使用 -P
选项的 PCRE 语法,但使用 POSIX 更具可移植性。
另外,如果你想将变量从PHP传递给shell脚本,建议使用escapeshellarg()
:
$re = 'FOO[[:space:]]*ONE';
shell_exec(sprintf("sh myscript.sh %s", escapeshellarg($re)));
应该提到的是,escapeshellarg()
在Windows和Linux之间(甚至在shell之间)并不一致;在某些情况下,您需要应用addcslashes()
。