有没有办法在不将双反斜杠解释为转义序列的情况下对文件进行分类?
在此示例中创建了一个 tex 文件:
cat <<EOF > file.tex
\\documentclass[varwidth=true,border=5pt]{standalone}
\\usepackage[utf8]{inputenc}
\\usepackage{amsmath}
\\begin{document}
$1
\\end{document}
EOF
我怎样才能写这个,以便反斜杠不必每次都写两次,但$1
仍然以其正常值(也可能包含反斜杠)扩展?
答案1
不,你运气不好。手册指出:
和 \必须用于引用字符 \、$ 和 `
有一个解决方法,使用几个此处文档:
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}\]
答案2
使用cat << \EOF > file.tex
。此处文档中不会解析参数扩展或转义。
$ cat t.sh
#!/usr/local/bin/bash
cat << \EOF
testing
\testing
\\testing
EOF
$ ./t.sh
testing
\testing
\\testing