+ Responder ao Tópico



  1. #1

    Padrão Printf: 08: invalid number

    Pessoal, boa noite!

    Sou novo no fórum e também no universo Linux.
    Me deparei com um problema ao executar comando printf.

    Fiz um script para manipular nome de arquivo dinamicamente e uma das funções é colocar uma parte do nome em sequência numérica a partir de uma entrada do usuário... Pois bem, para simplificar, quando executo o comando abaixo tenho alguns problemas.

    printf "%04d\n" $var

    Quando esta variável assume o valor 08 me é retornado o seguinte erro:

    -bash: printf: 08: invalid number

    No entanto o comando tem a saída 0000. Com 09 também dá o mesmo problema, mas o mais curioso é que quando o valor é 010, por exemplo, não há nenhum erro e o retorno do comando é 0008.
    Não tenho noção do que possa estar acontecendo... Quando o valor é somente 8 e não tem o zero à esquerda o comportamento é o esperado.

    Alguém pode ter idéia do que estou fazendo de errado?

    Obrigado

  2. #2

    Padrão

    Então, quando vc utiliza o "%d" você define que aquela posição receberá um valor inteiro, onde 08 é diferente de 8 que é um número inteiro, por isso a mensagem invalid number
    Agora o pq de vc colocar 010 e receber 0008, é uma boa pergunta... ele deve tentar fazer alguma conversão ..

    Talvez se você postar o código ai dê pra gente ter uma idéia de alguma solução alternativa pra você....

    Abço
    Filipe

  3. #3

    Padrão

    Felipe,
    Também achei estranho este tipo de conversão. O código está na máquina em meu trabalho e não tenho acesso a ela agora.
    Amanhã postarei o código.
    Obrigado pela resposa.

  4. #4

    Padrão

    Segue o código:

    #!/bin/bash
    lista=$(ls -l $1 | grep ^d | awk '{print $9}')
    ficha=$2
    for i in $lista; do
    dir1=$1/$i
    cd $dir1
    lista2=$(ls -l | grep ^d | awk '{print $9}')
    for n in $lista2; do
    mkdir /mnt/Processados/$ficha
    cd $dir1/$n
    mv $n.tif /mnt/Processados/$ficha/OUT09-$ficha-$(printf "%04d\n" $n).tif
    done
    ficha=$((($ficha+1)))
    done

    Ele pega o primeiro parâmetro que é o diretório onde estão as imagens, depois o número que vai iniciar a contagem de uma parte do nome. Para ficar mais claro, são vários arquivos em vários diretórios sendo que cada diretório tem somente 1 arquivo. E o nome do arquivo é o mesmo do diretório.

  5. #5

    Padrão

    Consegui resolver... Não da melhor forma, mas deu o resultado que esperava, para este caso.

    Usei o awk '{print substr($0,5,4)}' ao invés do printf. Como o tamanho da string é padrão, pude fazer desta forma.

    Mas ainda estou "encucado" com este problema do printf.

  6. #6

    Padrão

    Desculpa a demora... pra responder... só deu meu m... aqui essa semana....

    Cara eu estava lendro um livro do "Aurélio" e ele comenta que em shell tudo é string... então realmente não vai rolar aquele "d" ali no printf... mesmo pq nem sempre vc vai ter números inteiros (eu acho ..rs) nesta pasta... tudo bem que vc já fez funcionar... mas acho q se vc substituisse o "d" pelo "s" ia rolar tb...

  7. #7

    Padrão

    Bom, o "%s" funciona... aliás, não dá erro, só que não padroniza o número com 4 dígitos e zeros à esquerda. Ele retorna a mesma coisa que foi digitada e não faz a conversão.

    O %d é justamente para tratar a string como número decimal... só que não deu certo no meu caso..

    Mas é isso aí, pelo menos consegui resolver, apesar de ainda ter esta dúvida...
    De qualquer forma, muito obrigado! Cada dia aprendendo mais...