Bash:读取文件时丢失了特殊字符

Bar*_*rth 16 bash escaping

我有一个包含一些Latex的文件:

\begin{figure}[ht]
 \centering
 \includegraphics[scale=0.15]{logo.pdf}
 \caption{Example of a pdf file inclusion}
 \label{fig:pdfexample}
\end{figure}
Run Code Online (Sandbox Code Playgroud)

我想在bash脚本中阅读它:

while read line
  do
    echo $line
  done < "my.tex"
Run Code Online (Sandbox Code Playgroud)

输出是

begin{figure}[ht]
centering
includegraphics[scale=0.15]{logo.pdf}
caption{Example of a pdf file inclusion}
label{fig:pdfexample}
Run Code Online (Sandbox Code Playgroud)

为什么我会丢失反斜杠和初始空格?

如何保存它们?

Rob*_*b I 21

您丢失了反斜杠和空格,因为bash(通过其内置读取)正在评估文本的值 - 替换变量,查找转义字符(制表符,换行符)等.有关详细信息,请参阅联机帮助页.此外,echo将结合空格.

至于保存它们,我不确定你能不能.您可能会通过以下操作获得反斜杠:

while read -r line
  do
    echo $line
  done < "my.tex"
Run Code Online (Sandbox Code Playgroud)

应修改read以不尝试评估反斜杠.尽管如此,它仍然可能会吞噬领先的空间.

编辑:将$IFS特殊变量设置为空字符串,如下所示:

export IFS=
Run Code Online (Sandbox Code Playgroud)

在这种情况下将导致保留空格.

  • `-r`应该几乎总是与`read`一起使用(它应该是默认值). (8认同)
  • 您只能在读取命令期间临时设置IFS,因此它不会影响脚本的其余部分:`IFS = read -r line; ...` (3认同)
  • 引用`$ line`也应该保留空格. (2认同)