以下のコードの場合、実行すると次のメッセージが表示されます。
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
この問題を解決すると、ステートメントが期待どおりに機能しないことがわかります。例を挙げましょう。
echo "<td align="centre" valign="middle"><font color="green">fdr_cust$todays_date</td>">>checkscript_customtable.html
これはいいえたとえば、周囲に二重引用符を出力しますcentre
。"
前の文字がcentre
以前に開始された参照を終了するため、これは行われません<td
。
このデータを希望の方法で出力するには、Document Hereを使用することをお勧めします。
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
ところで、 --code で実行される出力リダイレクトの数をさらに減らすには、実際にelif
一度だけ行うだけですelse
(すべての出力が同じファイルに移動するため)。
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を使用する必要があります。サポートが必要な場合は、新しい質問を投稿してください。