You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:42:39