使用cat <<EOL写入文件时如何阻止Bash变量替换
如何在Bash Here文档中保留原始字符串避免命令/变量展开
这个问题在写Bash脚本时太常见了——默认情况下,Bash的Here文档(<<标记)会自动处理变量展开、命令替换甚至算术运算,所以你才会看到$(ping 8.8.8.8)被实际执行并把输出写入了文件。要保留原始字符串,有两种简单可靠的办法:
方法1:给结束标记包裹单引号
这是最省心的方式,直接把Here文档的结束标记用单引号括起来,整个文档内的内容都会被当作纯文本,不会触发任何展开操作。修改后的脚本如下:
#!/bin/bash cat >./foo.bar <<'EOL' t=$(ping 8.8.8.8) EOL
执行后,foo.bar里的内容就是原始的t=$(ping 8.8.8.8),完全不会执行ping命令。
方法2:转义单个特殊字符
如果只是需要保留部分特殊内容,不想全局禁用展开,也可以单独转义那些会被解析的特殊符号——比如给$加上反斜杠\:
#!/bin/bash cat >./foo.bar <<EOL t=\$(ping 8.8.8.8) EOL
这种方式适合文档里既有需要展开的变量,又有需要保留的原始命令/特殊字符的场景,灵活性更高。
你可以根据自己的需求选择其中一种方法,两种都能实现你想要的“写入原始字符串”的效果。
内容的提问来源于stack exchange,提问作者Salami
相关产品推荐
相关产品推荐

