1

そのため、インライン css を使用して html テーブルを作成し、メールとして送信できるようにするスクリプトがあります。データを配列変数に収集してから、その変数をテーブル値に入力しようとしています。

ここで変数を展開しようとしている引用または方法で閉じていることはわかっています。配列は bk[i] です。bk[1] または bk[2] をエコーするだけで問題なく動作しますが、テーブルで実行しようとすると、スペースとして表示されます。

表の 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はパイプによって開かれたサブシェルで定義されているため、ループが完了した後は使用できなくなります...

代わりに、次のようにする必要があります。

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)

述べる。これはバシズムです (したがって、他のシェルには移植できません)。しかし、あなたの質問がとタグ付けされていることは、あなたにとっては問題ではありません。


あなたのスタイルに関するコメント: いくつかのリダイレクト (>または>>) は避けてください。代わりにグループ化を使用します。

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、代わりにヒア ドキュメントを使用します。

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

そのほうがいいんじゃない?このように、ファイルは 1 回開かれますが、指定したスニペットでは、ファイルは何度も開かれます。

そして見て、それは動作します:

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 に答える