1

所以我有一个脚本,它使用内联 css 构建一个 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

我可以回显“成功”并且效果很好,但看不到获取 bk[i] 的内容来填充该字段。我确定它是单双 q=out 或括号语法问题,但似乎无法正确处理。

4

1 回答 1

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

如果馈送来自进程而不是文件,请使用进程替换:

而不是这个:

# 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

避免大量echos,使用 here 文档代替:

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

那不是更好吗?像这样,该文件将被打开一次,而在您提供的代码段中,该文件将被多次重新打开。

看,它有效:

gniourf@somewhere$ bk=(zero one two three four)
gniourf@somewhere$ td1="<td>"; td2="</td>"
gniourf@somewhere$ {
>     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
gniourf@somewhere$ 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>
gniourf@somewhere$ 

耶。

于 2013-10-31T14:24:09.383 回答