Quoting

Here-document 不解釋轉義序列,但帶有插值

  • July 8, 2017

有沒有辦法在不將雙反斜杠解釋為轉義序列的情況下對文件進行分類?

在本例中,創建了一個 tex 文件:

cat <<EOF > file.tex
\\documentclass[varwidth=true,border=5pt]{standalone}
\\usepackage[utf8]{inputenc}
\\usepackage{amsmath}

\\begin{document}
$1
\\end{document}
EOF

我怎樣才能這樣寫,這樣反斜杠就不必每次都寫兩次,但$1仍以其正常值擴展(也可能包含反斜杠)?

不,你運氣不好。手冊指出:

和 **必須**用於引用字元 \、$ 和 `

有一個解決方法,使用幾個here-docs:

cat <<\EOF > file.tex
\documentclass[varwidth=true,border=5pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}

\begin{document}
EOF
cat <<EOF >> file.tex
$1
EOF
cat <<\EOF >> file.tex
\end{document}
EOF

或者更好的是,一旦變數包含反沖,它在擴展時不會改變:

doc1='\documentclass[varwidth=true,border=5pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}

\begin{document}
'
doc2="$1"
doc3='\end{document}
'
cat <<EOF > file.tex
$doc1
$doc2
$doc3
EOF

這是一種複雜的寫作方式:

doc='\documentclass[varwidth=true,border=5pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}

\begin{document}
'"$1"'
\end{document}
'
printf '%s' "$doc" > file.tex

這也適用於其他一些範例:

$ doc='\[\begin{bmatrix} t_{11} & t_{12} & t_{13} & t_{14} \\ t_{21} & t_{22} & t_{23} & t_{24} \\ t_{31} & t_{32} & t_{33} & t_{34} \end{bmatrix}\]'

$ printf '%s\n' "$doc"
\[\begin{bmatrix} t_{11} & t_{12} & t_{13} & t_{14} \\ t_{21} & t_{22} & t_{23} & t_{24} \\ t_{31} & t_{32} & t_{33} & t_{34} \end{bmatrix}\]'

而且,只是為了表明變數只擴展一次

$ cat <<EOF
$doc
EOF
\[\begin{bmatrix} t_{11} & t_{12} & t_{13} & t_{14} \\ t_{21} & t_{22} & t_{23} & t_{24} \\ t_{31} & t_{32} & t_{33} & t_{34} \end{bmatrix}\]

引用自:https://unix.stackexchange.com/questions/376103