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