Obtenha o GNU bc para imprimir um caractere de nova linha

1

O GNU bc é muito pouco convencional. Não consigo encontrar nada on-line sobre como obtê-lo para imprimir um caractere de nova linha. Eu estou tentando obtê-lo para imprimir os primeiros 16 dígitos hexadecimais dos senos dos inteiros de 1 a 30. Espero que algo como isto funcione:

define mod(x, y) {
    oldscale=scale;
    scale=0;
    result=x%y;
    scale=oldscale;
    return result;
}
obase=16;
x=1;
while (x <= 30) {
    X=2^64*mod(s(x),1)-mod((2^64*mod(s(x),1)),1);
    print X"\n";
    x=x+1;
}

Mas isso não acontece.

    
por Melab 07.02.2015 / 03:37

1 resposta

1

Acabei de encontrar outro possível problema: se você estiver usando um caractere capital X , isso acontece quando tento usá-lo em bc :

X=3
(standard_in) 16: illegal character: X
(standard_in) 16: syntax error

Aparentemente, apenas caracteres minúsculos são variáveis (da página man: Números de entrada podem conter os caracteres 0-9 e AF. (Nota: Eles devem ser maiúsculos. Letras minúsculas são nomes de variáveis ) .

Portanto, mudar para um caractere minúsculo diferente (já que já existe outro minúscula x ) seria uma boa ideia.

Eu apenas tentei alguns testes muito básicos, aparentemente usando print em bc faz não imprimir uma nova linha à direita. Basta colocar a variável / número em sua própria linha faz imprimir uma nova linha:

$ echo "x=5; print x; print 999; x; 15; print 15; 12345"|bc
59995
15
1512345

Então, substituir sua linha print x"\n"; por apenas x; deve funcionar?

E, usar um \n com impressão deve funcionar também, talvez você tenha um problema de citação ... quando tentei fazer eco para bc usando aspas duplas (definitivamente errado ;-) ou com aspas duplas único citado \n s falha:

$ echo "x=5; print x; print 999; x; 15; print "15\n\n\n"; 12345"|bc
(standard_in) 1: syntax error
$ echo "x=5; print x; print 999; x; 15; print '15\n\n\n'; 12345"|bc
(standard_in) 1: illegal character: '
(standard_in) 1: illegal character: \
(standard_in) 1: syntax error
(standard_in) 1: illegal character: \
(standard_in) 1: illegal character: \
(standard_in) 1: illegal character: '

Mas o uso de aspas simples para echo e aspas duplas para o \n s funciona

$ echo 'x=5; print x; print 999; x; 15; print "15\n\n\n"; 12345'|bc
59995
15
15


12345

Então, também substituir sua linha print x"\n"; por print "x\n"; deve funcionar também?

Uma cotação informativa de man bc :

print list
The print statement (an extension) provides another method of output. The "list" is a list of strings and expressions separated by commas. Each string or expression is printed in the order of the list. No terminating newline is printed. Expressions are evaluated and their value is printed and assigned to the variable last. Strings in the print statement are printed to the output and may contain special characters. Special characters start with the backslash character (\). The special characters recognized by bc are "a" (alert or bell), "b" (backspace), "f" (form feed), "n" (newline), "r" (carriage return), "q" (double quote), "t" (tab), and "\" (backslash). Any other character following the backslash will be ignored.

    
por 07.02.2015 / 04:20

Tags