我有这个多行字符串(包括引号):
abc'asdf" $(dont-execute-this) foo"bar"''
如何在 Bash 中使用 heredoc 将其分配给变量?
我需要保留换行符。
我不想转义字符串中的字符,那会很烦人…
您可以通过以下方式避免无用的使用cat和更好地处理不匹配的引号:
cat
$ read -r -d '' VAR <<'EOF' abc'asdf" $(dont-execute-this) foo"bar"'' EOF
如果您在回显变量时不引用该变量,则会丢失换行符。引用它可以保留它们:
$ echo "$VAR" abc'asdf" $(dont-execute-this) foo"bar"''
如果您想在源代码中使用缩进来提高可读性,请在小于号后使用破折号。缩进必须仅使用制表符(无空格)来完成。
$ read -r -d '' VAR <<-'EOF' abc'asdf" $(dont-execute-this) foo"bar"'' EOF $ echo "$VAR" abc'asdf" $(dont-execute-this) foo"bar"''
相反,如果您想在结果变量的内容中保留制表符,则需要从IFS. 此处文档 ( EOF) 的终端标记不得缩进。
IFS
EOF
$ IFS='' read -r -d '' VAR <<'EOF' abc'asdf" $(dont-execute-this) foo"bar"'' EOF $ echo "$VAR" abc'asdf" $(dont-execute-this) foo"bar"''
可以通过按Ctrl-在命令行中插入选项卡V Tab。如果您使用的是编辑器,取决于哪个编辑器,它可能也可以工作,或者您可能必须关闭自动将制表符转换为空格的功能。
Ctrl
V
Tab