2013-12-11 52 views
0

我想寫一個腳本,生成一個LaTeX文件。腳本的第一部分應以樹形式顯示地圖的所有內容。第二部分應顯示每個可執行文件的內容。第一部分工作,第二部分不工作。下面是代碼:Bash腳本|如果那麼做

#!/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 
+0

請考慮編輯你的問題,包括*爲什麼*你認爲後半部分不工作。因爲我們沒有你的輸入文件,所以我們只能猜測。我可以評論''[-x $ file]'是問'$文件是否設置了可執行位?'這是你真正想要的嗎?你不會在'cat $ file'中執行。如果你只是想確保輸入是一個文件,請嘗試使用'[-f $ file]'。祝你好運。 – shellter

+1

你不應該在$ 1/*'中使用'for file來代替$ 1'中的文件嗎? – anishsane

回答

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 

UPDATE

cat << EOF被稱爲這裏文檔,您可以在man bash閱讀更多關於它。這與TeX中的逐字塊相似,使用大塊文本而非逐行回顯事物是非常有用的。文本從<< EOF開始,並在以EOF開頭的行之前結束。取而代之的EOF你可以使用任何其他標籤,例如:

cat << HELLO 
... 
... 
HELLO 

立即文檔可以被用作命令的標準輸入。這裏我們用它作爲cat的標準輸入,以回顯它。在我的回答中,我將它重定向到一個文件。

+0

您能否解釋一下「cat << EOF > $ out」是如何工作的? – Sensei

+0

或者至少給我鏈接,我可以閱讀有關的。 – Sensei

+0

當然,請參閱我的更新。 – janos