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
相关产品推荐
相关产品推荐

