fbpx

Comandos Linux – Comando dc

Comando Linux dc

Atualizado: 05/04/2019 por Computer Hope

comando dc

Em sistemas operacionais do tipo Unix, o comando dc é uma calculadora aritmética de precisão arbitrária.

Descrição

dc é uma calculadora de mesa que suporta notação aritmética arbitrária e de precisão ilimitada e polimento reverso (postfix). Também permite definir e chamar macros . Normalmente, dc lê da entrada padrão ; se algum argumento de comando é fornecido, eles são nomes de arquivos e o dc lê e executa o conteúdo dos arquivos antes de ler da entrada padrão. Toda saída normal é para saída padrão; toda a saída de erro é para erro padrão.

Uma calculadora de polimento reverso armazena números em uma pilha . Digitar um número o empurra para a pilha. As operações aritméticas retiram os argumentos da pilha e enviam os resultados.

Para inserir um número em dc , digite os dígitos (usando as letras maiúsculas A a F como “dígitos” ao trabalhar com bases de entrada maiores que dez), com um ponto decimal opcional. Notação exponencial não é suportada. Para inserir um número negativo, comece o número com ” _ ” (um sublinhado). ”  ” (traço ou hífen) não pode ser usado para isso, pois é um operador binário para subtração. Para inserir dois números em sucessão, separe-os com espaços ou novas linhas. Estes não têm significado como comandos.

Sintaxe

  dc [-V] [--version] [-h] [--help] [-e scriptexpression ] 
    [--expression = scriptexpression ] [-f scriptfile ] [--file = scriptfile ] 
    [ arquivo ...]

Opções

-V , –versionImprima as informações da versão de dc e um aviso de direitos autorais e saia.
-h , –helpImprima uma mensagem de uso resumindo brevemente essas opções de linha de comando e o endereço de relatório de erros e saia.
-e script , –expression = scriptInclua os comandos no script no conjunto de comandos a serem executados durante o processamento da entrada.
-f arquivo de script , –file = arquivo de scriptInclua os comandos contidos no arquivo script-file no conjunto de comandos a serem executados durante o processamento da entrada.

Se algum parâmetro da linha de comandos permanecer após o processamento acima, esses parâmetros serão interpretados como os nomes dos arquivos de entrada a serem processados. Um nome de arquivo ”  ” (traço ou hífen) refere-se ao fluxo de entrada padrão. A entrada padrão será processada se nenhum arquivo ou expressão de script for especificado.

Comandos de impressão

pImprime o valor na parte superior da pilha, sem alterar a pilha. Uma nova linha é impressa após o valor.
nImprime o valor na parte superior da pilha, removendo-o e não imprime uma nova linha depois.
PRetorna o valor no topo da pilha. Se for uma sequência , é impressa sem uma nova linha à direita. Caso contrário, é um número e a parte inteira do seu valor absoluto é impressa como um fluxo de bytes ” base (UCHAR_MAX + 1) “. Supondo que (UCHAR_MAX + 1) seja 256 (como na maioria das máquinas com bytes de 8 bits ), a sequência KSK0k1 / _1Ss [ls *] Sxd0> x [256 ~ Ssd0 <x] dsxxsx [q] Sq [Lsd0> qaPlxx] dsxxsx0sqLqsxLxLK + k também pode realizar essa função. (Grande parte da complexidade do código dc nativo acima se deve ao ~ computação dos caracteres para trás e ao desejo de garantir que todos os registros voltem aos seus estados originais.)
fImprime todo o conteúdo da pilha sem alterar nada. Este é um bom comando para usar se você estiver perdido ou quiser descobrir qual foi o efeito de algum comando.

Aritmética

+Retira dois valores da pilha, os adiciona e empurra o resultado. A precisão do resultado é determinada apenas pelos valores dos argumentos e é suficiente para ser exata.
Aparece dois valores, subtrai o primeiro exibido do segundo e pressiona o resultado.
*Aparece dois valores, multiplica-os e empurra o resultado. O número de dígitos da fração no resultado depende do valor atual da precisão e o número de dígitos da fração nos dois argumentos.
/Aparece dois valores, divide o segundo exibido do primeiro e pressiona o resultado. O número de dígitos da fração é especificado pelo valor de precisão.
%Aparece dois valores, calcula o restante da divisão que o comando / faria e empurra isso. O valor calculado é o mesmo que o calculado pela sequência Sd dld / Ld * – .
~Aparece dois valores, divide o segundo exibido do primeiro exibido. O quociente é pressionado primeiro e o restante é pressionado em seguida. O número de dígitos da fração usado na divisão é especificado pelo valor de precisão. (A sequência SdSn lnld / LnLd% também pode realizar essa função, com uma verificação de erro ligeiramente diferente.)
^Aparece dois valores e exponenciados, usando o primeiro valor exibido como expoente e o segundo exibido como base. A parte da fração do expoente é ignorada. O valor de precisão especifica o número de dígitos da fração no resultado.
|Aparece três valores e calcula uma exponenciação modular. O primeiro valor exibido é usado como módulo de redução; esse valor deve ser um número diferente de zero e deve ser um número inteiro. O segundo popped é usado como expoente; esse valor deve ser um número não negativo e qualquer parte fracionária desse expoente será ignorada. O terceiro valor exibido é a base que é exponenciada, que deve ser um número inteiro. Para números inteiros pequenos, é como a sequência Sm ^ Lm% , mas, ao contrário de ^ , este comando funcionará com expoentes arbitrariamente grandes.
vAbre um valor, calcula sua raiz quadrada e o pressiona. O valor de precisão especifica o número de dígitos da fração no resultado.

A maioria das operações aritméticas é afetada pelo “valor de precisão”, que você pode definir com o comando k . O valor de precisão padrão é zero, o que significa que toda aritmética, exceto a adição e subtração, produz resultados inteiros.

Controle de pilha

cLimpa a pilha, esvaziando-a.
dDuplica o valor na parte superior da pilha, enviando outra cópia. Assim, ” 4d * p ” calcula 4 ao quadrado e o imprime.
rInverte a ordem dos swaps dos dois principais valores da pilha. (Isso também pode ser realizado com a sequência SaSbLaLb .)

Registros

dc fornece pelo menos 256 registros de memória, cada um nomeado por um único caractere. Você pode armazenar um número ou uma string em um registro e recuperá-lo mais tarde.

srRetire o valor da parte superior da pilha e armazene-o no registrador r .
IrCopie o valor no registrador r e empurre-o para a pilha. Isso não altera o conteúdo de r .

Cada registro também contém sua própria pilha. O valor atual do registro é o topo da pilha do registro.

SrRetire o valor da parte superior da pilha (principal) e empurre-o para a pilha do registrador r . O valor anterior do registro se torna inacessível.
LrRetire o valor da parte superior da pilha do registrador r e empurre-o para a pilha principal. O valor anterior na pilha do registrador r , se houver, agora está acessível através do comando l r .

Parâmetros

dc possui três parâmetros que controlam sua operação: a precisão, o radical de entrada e o radical de saída. A precisão especifica o número de dígitos da fração a serem mantidos no resultado da maioria das operações aritméticas. O radical de entrada controla a interpretação dos números digitados; todos os números digitados usam esse radical. O radix de saída é usado para imprimir números.

As radias de entrada e saída são parâmetros separados; você pode torná-los desiguais, o que pode ser útil ou confuso. O radical de entrada deve estar entre 2 e 16, inclusive. O radix de saída deve ser pelo menos 2. A precisão deve ser zero ou maior. A precisão é sempre medida em dígitos decimais, independentemente da corrente de entrada ou saída atual.

iRetira o valor da parte superior da pilha e o utiliza para definir o raio de entrada.
oRetira o valor da parte superior da pilha e o usa para definir o raio de saída.
kRetira o valor da parte superior da pilha e o usa para definir a precisão.
IEmpurra o radical de entrada atual na pilha.
OEmpurra o radical de saída atual na pilha.
KEmpurra a precisão atual na pilha.

Cordas

o dc tem uma capacidade limitada de operar tanto em cadeias quanto em números; as únicas coisas que você pode fazer com as strings são imprimi-las e executá-las como macros (o que significa que o conteúdo da string é processado como comandos dc ). Todos os registradores e a pilha podem conter seqüências de caracteres, e o dc sempre sabe se algum objeto é uma sequência ou um número. Alguns comandos, como operações aritméticas, exigem números como argumentos e erros de impressão, se houver seqüências de caracteres. Outros comandos podem aceitar um número ou uma string; por exemplo, o comando p pode aceitar um e imprimir o objeto de acordo com seu tipo.

[ caracteres ]Cria uma sequência que contém caracteres (contidos entre caracteres balanceados [ e ] ) e empurra-a na pilha. Por exemplo, [foo] P imprime os caracteres foo sem nova linha.
aO topo da pilha é exibido. Se fosse um número, o byte de baixa ordem desse número será convertido em uma sequência e empurrado para a pilha. Caso contrário, o topo da pilha era uma sequência e o primeiro caractere dessa sequência é empurrado para trás.
xRetira um valor da pilha e o executa como uma macro. Normalmente deve ser uma string; se for um número, é empurrado de volta para a pilha. Por exemplo, [1p] x executa a macro 1p que empurra 1 na pilha e imprime 1 em uma linha separada.

As macros geralmente são armazenadas em registros; [1p] sa armazena uma macro para imprimir 1 no registro a e lax chama essa macro.

> rRetira dois valores da pilha e os compara assumindo que são números, executando o conteúdo do registro r como uma macro se o topo da pilha original for maior. Assim, 1 2> a invocará o conteúdo de registrador a e 2 1> a não.
!> rSemelhante, mas invoca a macro se o topo da pilha original não for maior que (menor que ou igual a) o que era o segundo ao topo.
< rSemelhante, mas chama a macro se o topo da pilha original for menor.
! < rSemelhante, mas invoca a macro se o topo da pilha original não for menor que (maior que ou igual a) o que foi o segundo a topo.
= rSemelhante, mas chama a macro se os dois números exibidos forem iguais.
! = rSemelhante, mas chama a macro se os dois números exibidos não forem iguais.
?Lê uma linha do terminal e a executa. Este comando permite que uma macro solicite entrada do usuário.
qsai de uma macro e também da macro que a invocou. Se chamado do nível superior ou de uma macro que foi chamada diretamente do nível superior, o comando q fará com que o dc saia.
QRetira um valor da pilha e o usa como uma contagem dos níveis de execução de macro a serem encerrados. Assim, o 3T sai de três níveis. O comando Q nunca fará com que o dc saia completamente, no entanto.

Consulta de status

ZRetira um valor da pilha, calcula o número de dígitos que ele possui (ou o número de caracteres, se for uma string) e envia esse número. A contagem de dígitos para um número não inclui zeros à esquerda, mesmo que esses apareçam à direita do ponto de raiz.
XRetira um valor da pilha, calcula o número de dígitos da fração que ele possui e empurra esse número. Para uma sequência, o valor enviado é 0 .
zEmpurra a profundidade atual da pilha: o número de objetos na pilha antes da execução do comando z .

Diversos

!Irá executar o resto da linha como um comando do sistema. Observe que a análise dos comandos ! < ,! = E !> Tem precedência; portanto, se você deseja executar um comando começando com < , = ou >, será necessário adicionar um espaço após o ! .
#Irá interpretar o restante da linha como um comentário.
: rRetirará os dois principais valores da pilha. O valor antigo da segunda para o topo será armazenado na matriz r , indexado pelo valor antigo da parte superior da pilha.
; rAbre o topo da pilha e o usa como um índice na matriz r . O valor selecionado é então empurrado para a pilha.

Observe que cada instância empilhada de um registro possui sua própria matriz associada. Assim, 1 0: a 0Sa 2 0: a La 0; ap imprimirá 1 , porque o 2 foi armazenado em uma instância de 0: a que foi posteriormente exibida.

Exemplos

Primeiro, na linha de comando, vamos entrar na calculadora da área de trabalho.

  dc

Parece que nada aconteceu. O prompt do dc é apenas uma linha em branco e está pronto para receber nossos comandos. Primeiro, vamos colocar um número na pilha. Que tal 1234 :

  1234

Mais uma vez, nada parece ter acontecido. Vamos usar f para examinar todo o conteúdo da pilha:

  f

Isso imprime o seguinte:

  1234

Portanto, o 1234 está na pilha e pronto para ser operado. Aqui vamos multiplicá-lo por 2 e imprimir o resultado. dc usa a notação polonês reverso (postfix), que coloca os operandos em primeiro lugar e os operadores em segundo. O comando abaixo em inglês diz: “Pegue o item superior da pilha, opere com o número dois, usando a multiplicação da operação e imprima o resultado”. O comando é:

  2 * p

Isso pega nosso item 1234 da pilha superior, multiplica por 2 e imprime o valor resultante:

  2468

Ótimo. Agora vamos subtrair 468 e imprimir o resultado:

  468 - p
  2000

Lembre-se de que, se não estivéssemos colocando p no final do comando, o mesmo aconteceria, mas sem saída. Ok, agora vamos dividir (” / “) nosso resultado 2000 por 2 e imprimir o resultado:

  2 / p
  1000

E agora vamos pegar a raiz quadrada:

  vp
  31

Como a precisão padrão é 0 (calcule zero casas após o ponto decimal) e não a alteramos, o resultado foi arredondado para o número inteiro mais próximo. A resposta está realmente mais próxima de 31,62. Para obter uma resposta mais precisa, temos que dizer ao dc para usar maior precisão. Vamos dizer para ele calcular para dez lugares usando o comando k :

  10 mil 1000 vp
  31.6227766016

Aqui, combinamos várias operações em um comando. O comando fez o seguinte, na seguinte ordem:

  1. empurrou 10 para a pilha,
  2. mandou k tirar o número da pilha e definir a precisão com tantas casas decimais,
  3. colocou 1000 na pilha,
  4. disse a v para tirar 1000 da pilha, calcular a raiz quadrada e empurrar o resultado para a pilha, e
  5. imprimiu o resultado com p .

Se quiséssemos, poderíamos definir a precisão para algo ridículo como 100000000, mas isso pode levar horas para ser calculado, e temos coisas melhores para fazer.

Vamos olhar a pilha um pouco mais de perto. Lembre-se, a pilha é como uma pilha de itens. Se você colocar um item na pilha, ele estará no topo. Se você retirar um item da pilha, retira o item superior (enviado mais recentemente) da pilha.

Primeiro, vamos limpar a pilha:

  c

Para garantir que foi limpo, vamos imprimir o item superior da pilha com o comando p :

  p
  dc: pilha vazia

Agora, vamos colocar dois itens na pilha. Digamos 1 e 2 .

  1
 2

Se usarmos o comando p , ele mostrará o item no topo da pilha. Aqui, esse será o item enviado mais recentemente, 2 :

  p
  2

Ou, podemos usar o comando f para exibir todo o conteúdo da pilha. Isso mostrará os itens de cima para baixo, em outras palavras, os mais recentes empurrados primeiro:

  f
  2
 1

Agora vamos operar na pilha. Vamos adicionar os dois itens principais e imprimir o resultado:

  + p
  3

Agora vamos ver o conteúdo completo da pilha usando f :

  f
  3

Os números 1 e 2 se foram. Ambos foram retirados da pilha pela operação de adição, que os juntou e empurrou o resultado, 3 , para a pilha.

Ao adicionar números, como acabamos de fazer, a ordem dos operandos não importa (1 + 2 é o mesmo que 2 + 1). Vamos usar a divisão agora, para ilustrar a ordem em que os itens da pilha são usados. Primeiro, vamos definir a precisão para duas casas decimais:

  2 k

Agora vamos limpar a pilha e pressionar 1 e 2 na pilha:

  c 1 2

Vamos verificar a pilha bem rápido:

  f
  2
 1

Agora vamos dividir e imprimir o resultado:

  / p
  .50

Como você pode ver, este é o resultado de 1 dividido por 2 , e não o contrário.

Nós terminamos por enquanto, então vamos sair do dc :

  q

O que nos leva ao prompt de comando do shell .

bc – Uma calculadora.

14 de novembro de 2019

Sobre nós

A Linux Force Brasil é uma empresa que ama a arte de ensinar. Nossa missão é criar talentos para a área de tecnologia e atender com excelência nossos clientes.

CNPJ: 13.299.207/0001-50
SAC:         0800 721 7901

Comercial  Comercial: (11) 3796-5900

Suporte:    (11) 3796-5900

Copyright © Linux Force Security  - Desde 2011.