Salário reajustado [RESOLVIDO]

1. Salário reajustado [RESOLVIDO]

Gustavo
rs23

(usa Ubuntu)

Enviado em 15/04/2010 - 01:43h


O seguinte script deve mostrar o salário reajustado mas esta com erro na seguinte linha que não consegui solucionar:

./salario.sh: linha 8: erro de sintaxe próximo do `token' não esperado `elif'
./salario.sh: linha 8: ` elif [ $salario -ge 900.01 -a $salario -le 1300 ] then'

#!/bin/bash

read -p "Entre com o valor do salário: " salario

if [ $salario -le 900 ] then
salarior = $salario * 1.20
echo "Salario reajustado eh $salarior"
elif [ $salario -ge 900.01 -a $salario -le 1300 ] then
salarior = $salario * 1.10
echo "O salario reajustado eh $salario"
elif [ $salario -lt 1300.01 -a $salario -gt 1800 ] then
salarior = $salario * 1.05
echo "O salario reajustado eh $salarior"
fi
if [ $salario -gt 1800 ]
then
echo "Não precisa de reajuste"
fi

exit 0




  


2. MELHOR RESPOSTA

Perfil removido
removido

(usa Nenhuma)

Enviado em 15/04/2010 - 23:51h

O erro é claro:

salario.sh: linha 9: [: 900.01: esperado expressão de número inteiro
+ '[' 1200 -lt 1300.01 -a 1200 -gt 1800 ']'
salario.sh: linha 13: [: 1300.01: esperado expressão de número inteiro

Então vamos transformar o salario em um numero inteiro.


#!/bin/bash

SAL=$1

NSAL=$( echo "($SAL * 100)" | bc)


if [ $NSAL -le 90000 ]; then
echo -ne "Salario menor ou igual que R$ 900,00\nReajuste salarial +20% = R$ "
echo "($SAL * 1.20)" | bc; echo

elif [ $NSAL -gt 90000 -a $NSAL -le 130000 ]; then
echo -ne "Salario maior que R$ 900,00 e menor ou igual a R$ 1300,00\nReajuste salarial: +10% = R$ "
echo "($SAL * 1.10)" | bc

elif [ $NSAL -gt 130000 -a $NSAL -le 180000 ]; then
echo -ne "Salario maior que R$ 1300,00 e menor ou igual a R$ 1800,00\nReajuste salarial: +5% = R$ "
echo "($SAL * 1.05)" | bc

else
echo 'Salario maior que R$ 1800. Não será reajustado.'
fi

exit

Veja que neste caso seria 100 * $SAL pois nosso dinheiro é formatado com 2 casas decimais.



3. Re: Salário reajustado [RESOLVIDO]

Douglas Giorgio Fim
douglas.giorgio

(usa Fedora)

Enviado em 15/04/2010 - 03:23h

eu nao testei, mas uma coisa que está na cara eh o ; que vc nao colocou e o modo de calculo, definição das variaveis

deixe assim

=====================================

#!/bin/bash

read -p "Entre com o valor do salário: " salario

if [ "$salario" -le 900 ]; then
salarior=(($salario*1.20))
echo "Salario reajustado eh $salarior"
elif [ "$salario" -ge 900.01 -a "$salario" -le 1300 ]; then
salarior=(($salario*1.10))
echo "O salario reajustado eh $salario"
elif [ "$salario" -lt 1300.01 -a "$salario" -gt 1800 ]; then
salarior=(($salario*1.05))
echo "O salario reajustado eh $salarior"
fi
if [ "$salario" -gt 1800 ]; then
echo "Não precisa de reajuste"
fi

exit 0

=================================================

de retorno de como ficou

vc tbm pode debuga o script p ter mais certeza doq está acontecendo, assim verificando com mais exatidão os erros

bash -xv script.sh


4. Re: Salário reajustado [RESOLVIDO]

Douglas Giorgio Fim
douglas.giorgio

(usa Fedora)

Enviado em 15/04/2010 - 03:25h

não tenho certeza, mas acho que errei na forma de calculo

acho que seria assim

==============================

#!/bin/bash

read -p "Entre com o valor do salário: " salario

if [ "$salario" -le 900 ]; then
salarior=$(($salario * 1.20))
echo "Salario reajustado eh $salarior"
elif [ "$salario" -ge 900.01 -a "$salario" -le 1300 ]; then
salarior=$(($salario * 1.10))
echo "O salario reajustado eh $salario"
elif [ "$salario" -lt 1300.01 -a "$salario" -gt 1800 ]; then
salarior=$(($salario * 1.05))
echo "O salario reajustado eh $salarior"
fi
if [ "$salario" -gt 1800 ]; then
echo "Não precisa de reajuste"
fi

exit 0

===================================

nao lembro de cabeça, e agr nao tem como eu testar, mas acho que eh assim msm


5. Re: Salário reajustado [RESOLVIDO]

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 15/04/2010 - 08:13h

O problema e' que o bash nao faz conta (nativamente) com numeros em ponto flutuante. Entao a sintaxe:

salario=$((salario*1.20))

E' errada por causa do 1.20. No bash voce tera que utilizar programas externos, como por exemplo o bc.

salario=`echo $salario * 1.20 | bc -l`

Para as comparacoes tambem...

Fraga ae a dica do SMarcell: [2]

http://www.vivaolinux.com.br/dica/Shell-operacoes-envolvendo-numeros-em-ponto-flutuante/

t+


6. Re: Salário reajustado [RESOLVIDO]

Gustavo
rs23

(usa Ubuntu)

Enviado em 15/04/2010 - 12:23h

Eu corrigi mas continua com erro

if [ $salario -le 900 ]
then
echo "Salario reajustado"
echo "($salario * 1.20)" |bc
elif [ $salario -ge 900.01 -a $salario -le 1300 ]
then
echo "Salario reajustado"
echo "($salario * 1.10)" |bc
elif [ $salario -lt 1300.01 -a $salario -gt 1800 ]
then
echo "Salario reajustado"
echo "($salario * 1.05)" |bc
fi
if [ $salario -gt 1800 ]
then
echo "Não precisa de reajuste"
fi

exit 0


Eu executei o script com o seguinte comando: bash -xv salario.sh

E o mesmo acusou erro na linha:

salario.sh: linha 9: [: 900.01: esperado expressão de número inteiro
+ '[' 1200 -lt 1300.01 -a 1200 -gt 1800 ']'
salario.sh: linha 13: [: 1300.01: esperado expressão de número inteiro






7. Re: Salário reajustado [RESOLVIDO]

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 15/04/2010 - 14:20h

A comparação com números em ponto flutuante também é feita via programas externos:

O bc retorna 1 quando a expressão é verdadeira e 0 pelo contrário (veja o link que postei)

Logo a linha:

elif [ $salario -ge 900.01 -a $salario -le 1300 ]

vira

elif [ `bc <<< "$salario >= 900.01 && $salario <= 1300"` -eq 1 ]

O bc ira retornar 1 caso a expressão seja verdadeira. Esse valor 1 irá substituir toda a expressão entre crases, logo o bash irá executar:

elif [ 1 -eq 1 ]

Como 1 == 1 o elif será executado.

Espero ter ajudado.
t+


8. Re: Salário reajustado [RESOLVIDO]

Gustavo
rs23

(usa Ubuntu)

Enviado em 16/04/2010 - 01:14h

Obrigado pela ajuda

Resolvido o script




9. Um pouquinho mais completo

Perfil removido
removido

(usa Nenhuma)

Enviado em 16/04/2010 - 02:18h

#!/bin/bash

SAL=$1

# troca virgula por ponto
CSAL=$( echo $SAL | sed -e 's/,/./g; s/[^0-9\.]//g')

# converte para inteiros para as comparações sejam validas
NSAL=$( echo "($CSAL * 100)" | bc | cut -d '.' -f1)

# conta casas decimais
CDEC=$( echo $CSAL | cut -d '.' -f2)


_caucular_novo_salario(){

if [ $1 -le 90000 ]; then

REAJST=$(echo "($2 * 1.20)" | bc);

echo -e "
Salario atual: R$ $2
Reajuste salarial = R$ $REAJST ( + 20% )
"

elif [ $1 -gt 90000 -a $1 -le 130000 ]; then

REAJST=$( echo "($2 * 1.10)" | bc);

echo -e "
Salario atual: R$ $2
Reajuste salarial = R$ $REAJST ( + 10% )
"

elif [ $1 -gt 130000 -a $1 -le 180000 ]; then

REAJST=$( echo "($2 * 1.05)" | bc)

echo -e "
Salario atual: R$ $2
Reajuste salarial = R$ $REAJST ( + 5% )
"

else

echo -e "
Salario atual: R$ $2
Sem reajuste salarial
"

fi
}

_zeros_esquerda(){

# retira os zeros a esquerda


ZRE=$(echo $1 | cut -c 1)

if [ $ZRE -eq 0 ]; then
# se o primeiro caractere for zero esta função chamara a si mesma dentro desta tomada de decisão tendo como novo parametro a mesma string sem o primeiro caractere
# Nota: pesquise recursividade
_zeros_esquerda $(echo $1 | cut -c 2-)

else
# senão escreve o primeiro parametro
echo $1

fi

}

if [ ${#CDEC} -le 2 ]; then
# se o numero de casas decimais for igual o menor que 2
_caucular_novo_salario $NSAL $(_zeros_esquerda $CSAL)

else

echo "
Erro: Entrada invalida $SAL

Exemplos de entradas validas:
123.00
123.10
123.05
456,00
234,76
234,05
"
fi

exit

Estude o script...