2013-10-31 41 views
1

因此,我有一個使用內聯css構建html表的腳本,因此它可以作爲電子郵件發送。 我正在將數據收集到數組變量中,然後試圖用該變量填充表值。在bash中生成html電子郵件時使用數組變量

我知道我關閉它的報價或方式我試圖在這裏擴大var。 這個數組是bk [i],如果我只是回聲bk [1]或bk [2]或者其他任何可以正常工作的東西,但是當我嘗試在表格中將它顯示爲空格時。

下面是表的第二行:

td1="<td>" 
    td2="</td>" 
    cat head.htm > test.html 
    echo "<tbody>" >> test.html 
    echo "<tr>" >> test.html 
    echo "<th scope=\"row\" style=\"background-color: rgb\(223, 223, 223\); \">" >> 
    test.html 
    echo "Backup</th>" >> test.html 
    echo $td1>> test.html 
    echo "${bk[1]}" "</td>" >> test.html 
    echo $td1>> test.html 
    echo ${bk[2]} $td2 >> test.html 
    echo $td1>> test.html 
    echo ${bk[3]} $td2 >> test.html 
    echo $td1>> test.html 
    echo ${bk[4]} $td2 >> test.html 
    echo $td1>> test.html 
    echo "success" $td2 >> test.html 
    echo $td1>> test.html 
    echo "success" $td2 >> test.html 
    echo $td1>> test.html 
    echo "success" $td2 >> test.html 
    echo $td1>> test.html 
    echo "success" $td2 >> test.html 
    echo "</tr>" >> test.html 

我可以回聲「成功」,並且工作正常,但無法看到獲取Get BK的內容[I]填充字段。我確定它是一個單雙q = out或括號語法問題,但看起來似乎無法正確。

+0

你的數組定義在哪裏?無論如何,它是否定義在子外殼中(即'while'循環)?另外,請使用分組而不是重定向每個「echo」! –

+0

@shellter,數組下標的內容被隱式評估爲算術表達式,所以你不需要美元符號。我無法找到手冊中記錄的位置。 –

+0

@glennjackman它在[參考資料手冊數組6.7](http://www.gnu.org/software/bash/manual/bashref.html#Arrays)。你會看到:_下標被視爲一個算術表達式,必須計算爲一個數字._ –

回答

4

你的數組定義在哪裏?

我問,因爲這是一個非常常見的錯誤做,例如,

bk=() 
cat file | while IFS= read -r line; do 
    bk[i++]=$line # or better bk+=("$line") 
done 

在這種情況下,數組bk由管打開子shell中定義的,所以不再提供循環完成...

後取而代之,你應該這樣做:

while IFS= read -r line; do 
    bk+=("$line") 
done < file 

萬一餵養來自一個過程,而不是從一個文件,使用過程中substitut離子:

取而代之的是:

# Do not do this 
my_cool_program | while IFS= read -r line; do 
    bk+=("$line") 
done 

做到這一點:

# Please use this 
while IFS= read -r line; do 
    bk+=("$line") 
done < <(my_cool_program) 

備註。這是一個bashism(因此不能移植到其他shell)。但你的問題被標記爲這不是你關心的問題。


只需一句話就你的風格:避免幾個重定向(>>>);改用分組:

td1="<td>" 
td2="</td>" 
{ 
    cat head.htm 
    echo "<tbody>" 
    echo "<tr>" 
    echo "<th scope=\"row\" style=\"background-color: rgb\(223, 223, 223\); \">" 
    echo "Backup</th>" 
    echo $td1 
    echo "${bk[1]}" "</td>" 
    echo $td1 
    echo ${bk[2]} $td2 
    echo $td1 
    echo ${bk[3]} $td2 
    echo $td1 
    echo ${bk[4]} $td2 
    echo $td1 
    echo "success" $td2 
    echo $td1 
    echo "success" $td2 
    echo $td1 
    echo "success" $td2 
    echo $td1 
    echo "success" $td2 
    echo "</tr>" 
} > test.html 

避免大量的echo S,使用此文件替代:

td1="<td>" 
td2="</td>" 
{ 
    cat head.htm - <<EOF 
<tbody> 
<tr> 
<th scope="row" style="background-color:rgb(223, 223, 223);">Backup</th> 
$td1${bk[1]}$td2 
$td1${bk[2]}$td2 
$td1${bk[3]}$td2 
$td1${bk[4]}$td2 
${td1}success$td2 
${td1}success$td2 
${td1}success$td2 
${td1}success$td2 
</tr> 
EOF 
} > test.html 

是不是更好?像這樣,文件將被打開一次,而在你給出的片段中,文件被重複使用很多次。

而且看,它的工作原理:

[email protected]$ bk=(zero one two three four) 
[email protected]$ td1="<td>"; td2="</td>" 
[email protected]$ { 
>  cat head.htm - <<EOF 
> <tbody> 
> <tr> 
> <th scope="row" style="background-color:rgb(223, 223, 223);">Backup</th> 
> $td1${bk[1]}$td2 
> $td1${bk[2]}$td2 
> $td1${bk[3]}$td2 
> $td1${bk[4]}$td2 
> ${td1}success$td2 
> ${td1}success$td2 
> ${td1}success$td2 
> ${td1}success$td2 
> </tr> 
> EOF 
> } > test.html 
[email protected]$ cat test.html 
<tbody> 
<tr> 
<th scope="row" style="background-color:rgb(223, 223, 223);">Backup</th> 
<td>one</td> 
<td>two</td> 
<td>three</td> 
<td>four</td> 
<td>success</td> 
<td>success</td> 
<td>success</td> 
<td>success</td> 
</tr> 
[email protected]$ 

耶。

+0

我的數組是在開始填充表格之前定義的,所以當我開始構建html時,它充滿了值(我已經成長爲真正的討厭內聯css)感謝您的反饋,我會試試這個。 – geezer

+0

@geezer然後它應該工作。請看我答案的最後部分。 –

+0

好酷,我在一個循環中定義它,現在用這種方法效果更好 - 新增了用bash構建html。感謝您的指導! – geezer

相關問題