Syntaxfehler in der Nähe des unerwarteten Tokens „elif“

Syntaxfehler in der Nähe des unerwarteten Tokens „elif“

Wenn ich den folgenden Code ausführe, erhalte ich die

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

Ich bin nicht sicher, welchen Fehler ich hier mache

Antwort1

Das Hauptproblem ist das Fehlen thennach dem ersten Test. Dies ist der Grund für Ihre Fehlermeldung.

Sobald Sie das behoben haben, werden Sie feststellen, dass Ihre echoAnweisungen nicht wie erwartet funktionieren. Nehmen wir ein Beispiel:

echo "<td align="centre" valign="middle"><font color="green">fdr_cust$todays_date</td>">>checkscript_customtable.html

Dieser Willenichtgibt die doppelten Anführungszeichen um zB aus centre. Dies geschieht nicht, da das "Zeichen direkt davor centredas Anführungszeichen beendet, das unmittelbar davor begann <td.

Um diese Daten in der gewünschten Weise auszugeben, würde ich die Verwendung eines „Here-Dokuments“ vorschlagen:

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

Der Text darunter <<END_HTMLund davor END_HTML(letzterermussnicht eingerückt sein und muss der einzige Text in dieser Zeile sein) wird an übergeben, catdas ihn an die Datei anfügt checkscript_customtable.html.

Die Shell erweitert die Variablen außerdem zu ihren Werten im Text.


Nebenbei bemerkt: Um die Anzahl der Ausgabeumleitungen in Ihrem Code weiter zu reduzieren , ifkönnen Sie tatsächlich mit nur einer auskommen (da die gesamte Ausgabe in dieselbe Datei geht):elifelse

if [[ $output_count_fdr -eq 0 ]]; then
   # code here
elif ...; then
   # code here
else
   # code here
fi >checkscript_customtable.html

Auf diese Weise können Sie die gesamte Ausgabe von überall in der ifzusammengesetzten Anweisung in eine Datei umleiten.

Antwort2

Abgesehen von den bereits besprochenen Problemen ist das Duplizieren von Code immer eine schlechte Idee. Erwägen Sie, Variablen zu füllen und dann einen einzelnen Block zu haben, in dem Sie stattdessen die Ausdrucke durchführen, z. B.:

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

Wahrscheinlich sollten Sie alles, was Sie tun, sowieso mit awk statt mit der Shell tun. Stellen Sie eine neue Frage, wenn Sie dabei Hilfe benötigen.

verwandte Informationen