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

Bash脚本特殊字符处理求助:含特殊字符的参数无法正常传递打印

解决含任意特殊字符的Bash参数传递问题

问题核心

你的脚本无法正确接收含特殊字符的参数,本质是Shell会自动解析$、!、'这类字符(比如$会被当作变量引用,!触发历史命令扩展),导致参数被拆分或篡改。以下是几种可靠的解决方法,无需修改原始字符串:

方法1:用printf %q生成Shell安全的转义字符串

printf %q会自动把任意字符串转义成Shell能正确识别为单一参数的格式,完全规避特殊字符解析问题。

本地调用示例

让程序将#string#替换为$(printf '%q' 'test@$134!')(原始字符串用单引号包裹),最终调用命令为:

./echo_string.sh $(printf '%q' 'test@$134!')

执行后脚本会正确输出test@$134!'。

SSH远程调用示例

由于SSH会把命令传递给远程Shell二次解析,需要额外转义一次:

ssh user@server "./echo_string.sh $(printf '%q' "$(printf '%q' 'test@$134!')")"

方法2:Base64编码传递(最稳妥,支持所有特殊字符)

通过Base64编码把原始字符串转换成无特殊字符的格式,传递后再解码,彻底避免Shell解析干扰。

步骤1:修改调用逻辑

让程序将#string#替换为Base64编码后的内容:

# 本地调用
encoded=$(echo -n 'test@$134!' | base64)
./echo_string.sh "$encoded"

# SSH远程调用
encoded=$(echo -n 'test@$134!' | base64)
ssh user@server "./echo_string.sh '$encoded'"

步骤2:修改echo_string.sh脚本

在脚本里解码输出:

#!/bin/bash
echo "$1" | base64 -d

方法3:确保脚本正确接收参数

无论用哪种方法,你的echo_string.sh必须用双引号包裹$1,否则参数里的空格、制表符等会被拆分:

#!/bin/bash
echo "$1"

内容的提问来源于stack exchange,提问作者John Wick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:02:34