以下のコードを実行すると、
checkscript_2.sh: line 43: syntax error near unexpected token `elif'
checkscript_2.sh: line 43: `elif [[ $fdr_count = "0" ]]'
if [[ $output_count_fdr = "0" ]]
echo "<td align="centre" valign="middle"><font color="red">FDR CUSTOM</td>">>checkscript_customtable.html
echo "<td align="centre" valign="middle"><font color="red">fdr_cust$todays_date</td>">>checkscript_customtable.html
echo "<td align="centre" valign="middle"><font color="red">The table for today has not been created</td>">>checkscript_customtable.html
elif [[ $fdr_count = "0" ]]
then
echo "<td align="centre" valign="middle"><font color="red">FDR CUSTOM</td>">>checkscript_customtable.html
echo "<td align="centre" valign="middle"><font color="red">fdr_cust$todays_date</td>">>checkscript_customtable.html
echo "<td align="centre" valign="middle"><font color="red">$fdr_count</td>">>checkscript_customtable.html
else
echo "<td align="centre" valign="middle"><font color="green">FDR CUSTOM</td>">>checkscript_customtable.html
echo "<td align="centre" valign="middle"><font color="green">fdr_cust$todays_date</td>">>checkscript_customtable.html
echo "<td align="centre" valign="middle"><font color="green">$fdr_count</td>">>checkscript_customtable.html
fi
ここで何を間違えているのか分からない
答え1
主な問題は、then
最初のテスト後に不足していることです。これがエラー メッセージの原因です。
echo
これを修正すると、ステートメントが期待どおりに動作しないことがわかります。 1 つの例を見てみましょう。
echo "<td align="centre" valign="middle"><font color="green">fdr_cust$todays_date</td>">>checkscript_customtable.html
この意志ないたとえば、 を囲む二重引用符を出力します。直前の文字が、直前に始まった引用符を終了しているcentre
ため、これは実行されません。"
centre
<td
このデータを希望どおりに出力するには、「ヒアドキュメント」を使用することをお勧めします。
cat <<END_HTML >>checkscript_customtable.html
<td align="centre" valign="middle"><font color="green">FDR CUSTOM</td>
<td align="centre" valign="middle"><font color="green">fdr_cust$todays_date</td>
<td align="centre" valign="middle"><font color="green">$fdr_count</td>
END_HTML
<<END_HTML
下と前のテキストEND_HTML
(後者しなければならないインデントされず、その行の唯一のテキストである必要があります) が に渡され、ファイルcat
に追加されますcheckscript_customtable.html
。
シェルは変数をテキスト内の値に展開します。
余談ですが、コード内で行う出力リダイレクトの数をさらに減らすにはif
、elif
実際else
には 1 つだけ実行するだけで済みます (すべての出力が同じファイルに送信されるため)。
if [[ $output_count_fdr -eq 0 ]]; then
# code here
elif ...; then
# code here
else
# code here
fi >checkscript_customtable.html
if
これは、複合ステートメント内の任意の場所からのすべての出力をファイルにリダイレクトする方法です。
答え2
すでに説明した問題に加えて、コードを重複させることは常に悪い考えです。変数を設定してから、代わりに印刷を行う単一のブロックを用意することを検討してください。例:
if [[ $output_count_fdr = "0" ]]; then
color='red'
msg='The table for today has not been created'
elif [[ $fdr_count = "0" ]]; then
color='red'
msg="$fdr_count"
else
color='green'
msg="$fdr_count"
fi
fmt='<td align="centre" valign="middle"><font color="%s">%s</td>\n'
{
printf "$fmt" "$color" 'FDR CUSTOM'
printf "$fmt" "$color" "fdr_cust${todays_date}"
printf "$fmt" "$color" "$msg"
} > checkscript_customtable.html
いずれにしても、何をするにしても、シェルではなく awk を使用する必要がある可能性があります。その点についてサポートが必要な場合は、新しい質問を投稿してください。