2016-09-16 70 views
0

當我運行的bash如下腳本 -for循環不工作中產生通過bash腳本的HTML文件

#!/bin/bash 
items="b.js 
    a.js 
    c.js" 
startScript='<script src="' 
endScript='"></script>' 
for item in $items 
do 
    echo $startScript$item$endScript 
done 

輸出:

<script src="c.js"></script> 
<script src="a.js"></script> 
<script src="b.js"></script> 

我要爲通過生成的HTML文件內循環運行此一個bash腳本。 For循環在這裏不起作用。

#!/bin/bash 
items="b.js 
    a.js 
    c.js" 
startScript='<script src="' 
endScript='"></script>' 
cat << noEcho 
<HTML> 
<HEAD> 
<TITLE> Bash Script </TITLE> 
</HEAD> 
<BODY> 
for item in $items 
do 
echo $startScript $item $endScript 
done 
</BODY> 
</HTML> 
noEcho 
+0

不要儲存在字符串中列出 - 爲此使用數組。 '文件=(b.js a.js c.js)',然後'爲'$ {files [@]}中的項目「; ...' –

+0

首先,'/ bin/sh'並不總是bash。其次,這不起作用?第三,我更喜歡'printf'來'echo'。第四,爲什麼bash而不是perl? –

+0

如果您想將某些代碼的輸出替換爲heredoc正文文本,則需要使用'$()'。 –

回答

3

簡單的例子具有固定的最明顯的錯誤:

#!/bin/bash 
files=(b.js a.js c.js) 
startScript='<script src="' 
endScript='"></script>' 
cat << noEcho 
<html><head><title>Bash Script</title></head><body> 
$(
for file in "${files[@]}"; do 
echo "${startScript}${file}${endScript}" 
done 
) 
</body></html> 
noEcho 

你可以看到上面的運行,其產量在http://ideone.com/rSsO9H

一些注意事項:

  • 不要這樣做。真。使用真正的模板語言,瞭解HTML語法並知道如何正確地轉義內容;在處理動態數據時,你會發現確保這種代碼幾乎不可能。
  • 字符串不是數組。如果你想要一個數組,使用一個實際的數組。
  • 如果要在給定一段代碼的輸出被代入的字符串(或者,在此情況下,一個定界符),它需要在一個命令替換:$()