Antes de tudo, para responder sua pergunta, -eq
é para comparação de números inteiros. Use =
para strings. Eu assumo que este é seu erro principal.
Alguns conselhos:
- cite suas variáveis por padrão (por exemplo,
"$n"
, não apenas$n
). A não marcação pode ser necessária em alguns casos, mas deve ser uma exceção - use sempre
set -u
para detectar o uso de variáveis não inicializadas - concatene suas instruções sed em um comando sed:
sed -e 's/ //g; s/[+x]/ & /g;'
em vez do pipeline de três comandossed -e 's/ //g' | sed -e 's/+/ + /g' | sed -e 's/x/ x /g'
- think shell (Eu sei que isso é difícil quando você está aprendendo sh): divida seu código em pequenos comandos (funções), use parâmetros e aproveite o analisador de shell (
for word in "$@"
). Aqui, o que eu vejo é um grande loop com muitoN++
e você está analisando tudo sozinho, caractere por caractere.
Para a diversão do code golf, aqui está a parte do cálculo em uma avaliação sed + aritmética:
tandenstokers()
{
echo "$((
$(sed -e '
s/ //g
s/[xX]/*/g
s/|\+/\(&\)/g
s/|/+1/g
' <<< "$*" )
))"
}
$ tandenstokers "| | x|| | |+|"
9
$ tandenstokers "|| + ||| - | X |||| / ||"
3
Esta é uma solução radicalmente diferente. Tome isso como uma curiosidade, e não deixe cair o seu! O que eu faço é apenas transformar sua fórmula tandenstokers em uma fórmula aritmética regular, que eu finalmente avalio com $(( ... ))
.
Deixo como um exercício a contagem de palitos de dente na fórmula.