Shell脚本重定向命令时不丢失sed等特殊字符的问题问询
问题原因
你当前使用的命令存在两个核心问题导致特殊字符丢失:
- 单引号嵌套冲突:外层
printf用单引号包裹待写入内容,内层sed命令的单引号会提前闭合外层的单引号,后续内容会被shell直接解析而非作为文本写入文件 - 特殊字符未转义:
\、$等符号在当前的引号上下文下会被当做转义符/变量标识符解析,不会原样保留
最优修复方案
推荐使用带引号的here-doc格式实现内容原样写入,不需要额外转义任何特殊字符,语法更清晰不易出错:
# 原样写入脚本内容 cat > /opt/webhook/sns.sh <<'EOF' #!/bin/bash aws sns publish --subject "$(hostname -f)" --message "$(alerts -v | sed 's/\x1b\[[0-9;]*m//g' && echo -e "\n\n" && alerts --components | sed 's/\x1b\[[0-9;]*m//g')" EOF # 赋予脚本执行权限 chmod +x /opt/webhook/sns.sh
该方案的核心是<<'EOF'中EOF被单引号包裹,会禁用所有shell展开逻辑,内部的所有字符都会原样写入到目标文件中。
兼容原printf写法的修复方案
如果要保留原printf的写法,需要对嵌套单引号和反斜杠做转义处理:
printf '#!/bin/bash\naws sns publish --subject "$(hostname -f)" --message "$(alerts -v|sed '\''s/\\x1b\\[[0-9;]*m//g'\'' && echo -e "\\n\\n" && alerts --components|sed '\''s/\\x1b\\[[0-9;]*m//g'\'')"\n' > /opt/webhook/sns.sh chmod +x /opt/webhook/sns.sh
转义规则说明:
- 内层单引号用
'\''格式转义:逻辑为闭合外层单引号→输出字面单引号→重新开启外层单引号 - 所有反斜杠需要双写为
\\,避免被printf当做转义符解析
内容的提问来源于stack exchange,提问作者Catalina Cenan
相关产品推荐
相关产品推荐

