쉘 스크립트에서 문자열을 인쇄할 때 이스케이프 문자를 무시합니다.

쉘 스크립트에서 문자열을 인쇄할 때 이스케이프 문자를 무시합니다.

방금 LaTeX 표현식을 PNG 파일로 저장하기 위한 간단한 쉘 스크립트를 작성했습니다. 이중 백슬래시 \\인 "다음 줄" LaTeX 구문을 제외하고는 잘 작동합니다.

예를 들어, 입력 표현식이 다음과 같을 때:

\left( \begin{array}{cc}1 & 2\\ 3 & 4\end{array} \right)

이중 백슬래시는 단일 백슬래시로 축소됩니다. 표현식에 백슬래시를 더 추가할 수 있다는 것을 알고 있지만 표현식이 이상한 LaTeX-bash 조합이 아닌 진정한 LaTeX이기를 원합니다.

내 스크립트:

#!/bin/bash

if [ $# -ne 2 ]; then
    echo -e "Er moeten twee argumenten worden opgegeven:\n(1) LaTeX code\n(2) Bestandsnaam zonder extensie"
else
    SaveDir="/home/pieter"
    echo "\documentclass{article}\usepackage[utf8x]{inputenc}\pagestyle{empty}\begin{document}\[ $1 \]\end{document}" > /tmp/$2.tex
    latex -output-directory /tmp -interaction=batchmode $2.tex
    dvips -o /tmp/$2.ps -E /tmp/$2.dvi
    convert -units PixelsPerInch -density 200 /tmp/$2.ps -trim $SaveDir/$2.png
fi

그렇다면 어떻게 이스케이프 문자를 무시하고 LaTeX 표현식을 문자 그대로 인쇄할 수 있습니까? sed를 사용하지 않는 것이 좋습니다.

답변1

모든 문자는 작은따옴표 사이에서 문자 그대로 해석됩니다. 큰따옴표를 사용했는데 일부 문자( $"\`)가 큰따옴표 사이에 해석되었습니다. 바라보다 환경 변수에서 작은따옴표와 큰따옴표의 의미는 무엇입니까?그러나 귀하의 질문에 나오는 예에서는 문제의 문자를 전혀 사용하지 않습니다. 사용하지 않는 다른 잠재적인 문제 echo( echo내장 함수는 일부 쉘에서 백슬래시 확장을 수행하지만 명시적으로 활성화하지 않는 한 bash에서는 수행하지 않음) 및 $1( echo $1백슬래시 확장을 수행하지만 echo "$1"bash에서는 그렇지 않음)).

문자열을 그대로 인쇄하는 안전하고 이식 가능한 방법은 다음과 같습니다.

printf '%s\n' "$1"

\n문자열 뒤에 개행 문자를 원하지 않으면 제거하십시오.

이게 진짜 코드인가요? 그렇다면 매개변수를 전달하는 방식에 문제가 없는지 확인하세요. 다음과 같이 작성해야 합니다.

myscript '\left( \begin{array}{cc}1 & 2\\ 3 & 4\end{array} \right)' filename

TeX 조각에서 작은따옴표를 사용해야 하는 경우 이를 이스케이프해야 합니다 '\''.

당신은 관심이 있을 수도 있습니다여기 문서이를 통해 소스 파일에 여러 줄 문자열을 편리하게 포함할 수 있습니다. 또는 여러 줄의 문자열을 작은따옴표로 묶을 수도 있습니다.

printf '%s' '\documentclass{article}
\usepackage[utf8x]{inputenc}
\pagestyle{empty}
\begin{document}
\[ '"$1"' \]
\end{document}
' >"/tmp/$2.tex"

큰따옴표도 사용해야 합니다 $2. 특별한 이유가 없는 한 변수 대체에는 항상 큰따옴표를 사용하십시오.

답변2

TeX 출력을 스크립트 내에서 수정하려면 가장 안전한 방법은 다음과 같은 것을 사용하는 것입니다.

cat > $2.tex << 'ENDHEADER'
\documentclass{article}
 \usepackage[utf8x]{inputenc}
 \pagestyle{empty}
\begin{document}
\[
ENDHEADER
echo $1 >> $2.tex
cat >> $2.tex << 'ENDFOOTER'
\]
\end{document}
ENDFOOTER

cat및 태그 사이의 데이터 END는 교체 없이 그대로 출력됩니다. (추가된 모든 줄 바꿈이 괜찮다고 가정합니다.)

'TeX를 인수로 전달할 때는 큰따옴표( )를 사용해야 합니다 .

./your_script '\left( \begin{array}{cc}1 & 2\\ 3 & 4\end{array} \right)'

관련 정보