base10 não funciona

4

Eu comecei recentemente no bash scripting e tentei programar um script para contar de 0000 a 9999 - uma tarefa bem fácil, eu pensei. Então eu corri para o problema com bash tendo 0007 como um octal e dando um erro para 0009. Eu encontrei a solução com base10 mas não funciona. O que estou fazendo de errado? Essa é a parte ofensiva do código:

guess=0000
for guess in $(seq -f "%04g" 0000 9999)
do
echo $((10#guess))
guess=$((10#guess+1))
done
    
por d4foasta 14.10.2016 / 18:32

2 respostas

4

Observe que seu loop é um pouco redundante, for irá definir guess para todos os valores impressos por seq , você não precisa alterar o valor sozinho.

for guess in $(seq -f "%04g" 0000 9999) ;do
    guess=$((10#guess+1))
done

Na verdade, o loop for praticamente substitui a atribuição que você faz, compare com isso:

$ for x in 9 6 3 ; do echo $x; x=1 ; done
9
6
3

(O valor atribuído de 1 nunca é impresso.)

Então, apenas isso funcionaria:

$ for x in $(seq -f "%04g" 1 2) ; do echo $x;  done
0001
0002

Ou você pode usar printf para obter o número no formato desejado:

$ for x in $(seq 1 2) ; do printf "%04d\n" $x;  done
0001
0002

Eu acho que alguns sistemas não têm seq , então você precisa fazer sem. No Bash, isso deve funcionar:

$ for (( x=0 ; x < 100 ; x++ )) ; do 
   printf "%04d\n" $x
  done
    
por 14.10.2016 / 18:47
6

Você perdeu um $ antes do nome da variável ( $guess ), para marcar isso como expansão de variável:

for guess in $(seq -f "%04g" 0000 9999)
do
  echo $((10#$guess))
  guess=$((10#$guess+1))
done

Caso contrário, a expansão aritmética $(()) está funcionando em guess literalmente, não seu valor, levando ao erro sobre o valor ser muito grande para base.

    
por 14.10.2016 / 18:38