Parece um erro simples: ${ENDOFLINE%$} retira um $ no final de $ENDOFLINE , mas o que você quer fazer é usar $ENDOFLINE literalmente e ter um $ para indicar o fim de a linha.
if [[ ("$LINE" =~ "^#;") && (( ("$LINE" =~ "${ENDOFLINE}$") )) ]];
Isso funciona em zsh, mas não em ksh ou bash. O Bash requer que o regexp $ seja não-referenciado (caso contrário, ele é interpretado literalmente), e o ksh não gosta de parênteses duplos dentro de [[ … ]] (ele os interpreta como uma instrução aritmética). Esta linha mais simples funciona em todos os três shells (note que [[…]] é um dos poucos lugares onde você não precisa de "…" em torno de expansões variáveis):
if [[ $LINE =~ ^"#;" && $LINE =~ $ENDOFLINE$ ]];
Se $ENDOFLINE nunca sobrepor com #; (por exemplo, se ENDOFLINE for ;foo , você aceitará #;;foo , mas rejeitar #;foo ), poderá reduzir isso para um único teste:
if [[ $LINE =~ ^"#;".*$ENDOFLINE$ ]];
Você também pode usar um padrão curinga em vez de um regexp aqui:
if [[ $LINE = "#;"*"$ENDOFLINE" ]];
A construção [[…]] não existe em todas as shells, é específica para bash, ksh e zsh. Em outras shells (Bourne, dash, qualquer coisa POSIX), você pode fazer combinações curinga com o case construct:
case $LINE in
"#;"*"$ENDOFLINE") echo score;;
*) echo no score;;
esac