예상치 못한 토큰 `elif' 근처에 구문 오류가 발생했습니다.

예상치 못한 토큰 `elif' 근처에 구문 오류가 발생했습니다.

내가 실행할 때 아래 코드의 경우

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.

이 데이터를 원하는 방식으로 출력하려면 "여기 문서"를 사용하는 것이 좋습니다.

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실제로 하나만 수행하면 됩니다(모든 출력이 동일한 파일로 이동하므로).elifelse

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를 사용하여 무엇이든 해야 할 가능성이 있습니다. 도움이 필요하면 새 질문을 게시하세요.

관련 정보