Bash中向PHP脚本传递含!字符参数的报错问题求助
解决bash中传递含
!字符字符串的问题 这是bash的历史扩展机制在搞鬼!!是bash里的特殊字符,用来调用历史命令,哪怕在双引号里它依然会被解析,所以你输入"MYW!ORD"时,bash会把!ORD当成要查找的历史事件,自然就报event not found了;而用"MYW\!ORD"的话,双引号里的反斜杠会被保留下来,导致最终写入文件的字符串带反斜杠。
给你几个靠谱的解决办法:
最推荐:用单引号包裹字符串
单引号在bash里会完全屏蔽所有特殊字符的解析,直接把内容原封不动传递给脚本。执行这个命令就行:php cfg.php --name=smtppass --set='MYW!ORD'这样PHP脚本接收到的就是纯纯的
MYW!ORD,不会有任何额外字符。临时关闭历史扩展
如果不想改引号,可以先关闭当前会话的历史扩展功能,执行完命令再恢复:# 关闭历史扩展 set +o histexpand # 执行你的命令,双引号也能正常用了 php cfg.php --name=smtppass --set="MYW!ORD" # 恢复历史扩展(可选,如果你之后还要用历史命令调用的话) set -o histexpand直接转义
!且不用双引号
如果你习惯不用引号,直接给!加反斜杠转义就行,bash会把\!解析成单个!:php cfg.php --name=smtppass --set=MYW\!ORD
简单总结下:bash里单引号是"完全字面量模式",处理带特殊字符的字符串最省心;双引号会保留部分特殊字符的解析能力,所以遇到!这种特殊字符就会出问题。
内容的提问来源于stack exchange,提问作者mahmood
相关产品推荐
相关产品推荐

