Definição de tamanho de variável e concatenação

1. Definição de tamanho de variável e concatenação

Eduardo Schettini Guimarães
schettini

(usa Outra)

Enviado em 21/06/2016 - 15:41h

Boa tarde a todos,

Estou aprendendo a trabalhar com shell script e estou me deparando com a seguinte situação:
No banco de dados eu tenho código dos clientes e vendedores como smallint sequencial, ou seja, começa do 1 em diante.
Mas no sistema que me trás o relatório de vendas vem da seguinte maneira:
Para clientes: c0001
Para vendedor: v0011

Nesse exemplo queria conseguir transformar o dado que puxei do banco de acordo com o padrão do relatório para fazer um filtro solicitado pelo meu chefe.

O meu problema não está em concatenar em si, mas descobrir o tamanho da variável e concatenar a quantidade de zeros necessários. Exemplo:
Puxei do banco o cliente 11, preciso transformar em c0011.
Tentei fazer o seguinte:
$tamanho=${#varCliente}

Mas quando executo no terminal dá problema



  


2. Re: Definição de tamanho de variável e concatenação

thinomar
thinomar

(usa Linux Mint)

Enviado em 21/06/2016 - 16:36h

Acho que isso pode ajudar, só precisa ajustar as variáveis "código" e "tipo" de acordo com seu contexto:
#Tamanho fixo de código. 4 pq o exemplo é c0001
TAMANHO_FIXO=4
tamanho_codigo=${#codigo}
# Se codigo for maior que 0 e menor que tamanho maximo
if [[ $tamanho_codigo -gt 0 && $tamanho_codigo -le $TAMANHO_FIXO ]] ; then
# Se codigo for menor que tamanho maximo
if [ $tamanho_codigo -lt $TAMANHO_FIXO ] ; then
# Quantidade de 0's a adicionar antes do codigo
zeros=$(echo "$TAMANHO_FIXO - $tamanho_codigo" | bc -l)
# Concatenacao de parte numerica
codigo="`printf '0%.s' $(seq 1 $zeros)`$codigo"
fi
# Verificando tipo de individuo
if [ $tipo = "cliente" ] ; then
codigo="c$codigo"
elif [ $tipo = "vendedor" ] ; then
codigo="v$codigo"
fi
echo $codigo
else
echo "Codigo invalido"
fi


Porém o código é só para fazer as validações, porque para imprimir números com tamanho fixos, você pode fazer assim:
printf "%04d" 1 

Basta mudar o 4 pela quantidade desejada de casas. O problema é que não dá pra validar se o número possui ou não o tamanho máximo permitido apenas com esse comando.
--
-I've been talking to the main computer
-And...?
-It hates me


3. Re: Definição de tamanho de variável e concatenação

Eduardo Schettini Guimarães
schettini

(usa Outra)

Enviado em 22/06/2016 - 07:11h

thinomar escreveu:

Acho que isso pode ajudar, só precisa ajustar as variáveis "código" e "tipo" de acordo com seu contexto:
#Tamanho fixo de código. 4 pq o exemplo é c0001
TAMANHO_FIXO=4
tamanho_codigo=${#codigo}
# Se codigo for maior que 0 e menor que tamanho maximo
if [[ $tamanho_codigo -gt 0 && $tamanho_codigo -le $TAMANHO_FIXO ]] ; then
# Se codigo for menor que tamanho maximo
if [ $tamanho_codigo -lt $TAMANHO_FIXO ] ; then
# Quantidade de 0's a adicionar antes do codigo
zeros=$(echo "$TAMANHO_FIXO - $tamanho_codigo" | bc -l)
# Concatenacao de parte numerica
codigo="`printf '0%.s' $(seq 1 $zeros)`$codigo"
fi
# Verificando tipo de individuo
if [ $tipo = "cliente" ] ; then
codigo="c$codigo"
elif [ $tipo = "vendedor" ] ; then
codigo="v$codigo"
fi
echo $codigo
else
echo "Codigo invalido"
fi


Porém o código é só para fazer as validações, porque para imprimir números com tamanho fixos, você pode fazer assim:
printf "%04d" 1 

Basta mudar o 4 pela quantidade desejada de casas. O problema é que não dá pra validar se o número possui ou não o tamanho máximo permitido apenas com esse comando.
--
-I've been talking to the main computer
-And...?
-It hates me


thinomar Muito obrigado pela resposta. Só consegui ver hoje, pois ontem quando sai do trabalho fui parar no hospital. Vou testar agora. Qualquer novidade informo.


4. Re: Definição de tamanho de variável e concatenação

Eduardo Schettini Guimarães
schettini

(usa Outra)

Enviado em 22/06/2016 - 08:22h

Cara realmente deu certo o código que me passou, agradeço muito. Mas um colega aqui achou outra solução, que é até mais simples.
Foi do portal www.delete.com.br/script-cut-para-pegar-os-ultimos-caracteres/

Fiz assim:

varCliente="000"$linhaCliente #linha cliente é lida de um arquivo txt pegando somente o codigo inteiro
numCliente=$(echo "${varCliente}" | rev | cut -5-b | rev)
codCliente="c"$numCliente
Assim resolveu. Mas muito obrigado pela a ajuda.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts