Bash脚本|如果那么做

时间:2013-12-11 02:39:25

标签: bash latex

我正在尝试编写一个生成LaTeX文件的脚本。脚本的第一部分应以树形式显示地图的所有内容。第二部分应显示每个可执行文件的内容。第1部分工作,第2部分不工作。这是代码:

#!/bin/bash
echo "\documentclass{article}" > script.tex
echo "\usepackage{listings}" >> script.tex
echo "\begin{document}" >> script.tex
echo "\begin{lstlisting}" >> script.tex
tree $1 >> script.tex
echo "\end{lstlisting}" >> script.tex

for file in $1
do
if [ -x $file ]
then
echo "\begin{lstlisting}" >> script.tex
cat $file >> script.tex
echo "\end{lstlisting}" >> script.tex
fi
done
echo "\end{document}" >> script.tex

1 个答案:

答案 0 :(得分:2)

看起来你用一个目录参数调用这个脚本,它会在$1中传递,然后你可能希望从该目录中的文件生成一个tex文件。这是修复,还有一些其他的小改进和保护措施:

#!/bin/bash

out=script.tex
cat << EOF >$out
\documentclass{article}
\usepackage{listings}
\begin{document}
\begin{lstlisting}
EOF
tree "$1" >> $out
echo "\end{lstlisting}" >> $out

for file in "$1"/*
do
    if [ -x "$file" ]
    then
        echo "\begin{lstlisting}" >> $out
        cat "$file" >> $out
        echo "\end{lstlisting}" >> $out
    fi
done
echo "\end{document}" >> $out

<强>更新

cat << EOF被称为 Here Document ,您可以在man bash中详细了解它。这类似于TeX中的逐字块,它对于处理大块文本非常有用,而不是逐行回显。文本从<< EOF开始,在以EOF开头的行之前结束。您可以使用任何其他标签代替EOF,例如:

cat << HELLO
...
...
HELLO

此处文档可用作命令的标准输入。在这里,我们将它用作cat的标准输入,以回应它。在我的回答中,我将其重定向到一个文件。