AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 480121
Accepted
Fabby
Fabby
Asked: 2018-11-07 06:33:55 +0800 CST2018-11-07 06:33:55 +0800 CST 2018-11-07 06:33:55 +0800 CST

简单的命令行计算器

  • 772

问题:

我时不时需要在命令行环境中进行简单的算术运算。EG 给出以下输出:

Disk /dev/sdb: 256GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name  Flags
 1      1049kB  106MB   105MB   fat32                 hidden, diag
 2      106MB   64.1GB  64.0GB  ext4
 3      64.1GB  192GB   128GB   ext4
 5      236GB   256GB   20.0GB  linux-swap(v1)

在命令行上计算分区 3 和 5 之间未分配空间大小的简单方法是什么?

我已经尝试过的:

公元前

bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
236-192
44
quit

上面的粗体字是我需要输入的所有内容来做一个简单236-192的bc 1+1回声File 1+1 is unavailable.

表达式

expr 236 - 192

我需要在运算符之前和之后键入空格expr 1+1,就像 echoes一样1+1。

shell calculator
  • 21 21 个回答
  • 73135 Views

21 个回答

  • Voted
  1. Best Answer
    Stephen Kitt
    2018-11-07T07:30:52+08:002018-11-07T07:30:52+08:00

    您可以减少使用涉及的详细程度bc:

    $ bc <<<"236-192"
    44
    $ bc <<<"1+1"
    2
    

    (假设你的外壳支持)。

    如果您希望将其作为函数:

    $ c() { printf "%s\n" "$@" | bc -l; }
    $ c 1+1 22/7
    2
    3.14285714285714285714
    

    (-l启用标准数学库并将默认比例增加到 20。)

    c如果您想让它始终可用,请将定义存储在您最喜欢的 shell 启动文件中。

    • 70
  2. user232326
    2018-11-08T02:02:13+08:002018-11-08T02:02:13+08:00

    概括

    列出了几种解决方案(shell、awk、dc、perl、python 等)。

    可以使用任何选项定义函数(gawk 似乎是最灵活的使用)

    c () { local in="$(echo " $*" | sed -e 's/\[/(/g' -e 's/\]/)/g')";
           gawk -M -v PREC=201 -M 'BEGIN {printf("%.60g\n",'"${in-0}"')}' < /dev/null
         }
    

    并像这样使用它:

    $ c 236- 192
    44
    

    壳

    CLI 中最简单的计算是 CLI (shell) 本身(如果IFS是默认值):

    $ echo $(( 22 + 333 ))
    355
    

    空格可以省略:

    $ echo $((22*333))
    7326
    

    因为它是POSIX 的一部分,所以 几乎所有的 shell 都有它。并且它包含了大部分C 语言数学功能(除了 zsh 具有不同的优先级,设置 C_PRECEDENCES 将其恢复为兼容值):

    $ echo $((22*333^2))
    7324
    

    并且一些shell 具有大部分 C 语言数学语法(包括逗号):

    $ echo $((a=22,b=333,c=a*b,c))
    7326
    

    但在某些 shell 中,它只是整数数学(在当今的操作系统中通常小于 2 63 ):

    $ echo $((1234/3))
    411
    
    $ zsh -c 'echo $((2**63))'
    -9223372036854775808
    

    一些shell可以做浮动数学:

    $ ksh -c 'echo $((1234/3.0))'
    411.333333333333333
    
    $ ksh -c 'echo $((12345678901234567890123/3.0))'
    4.11522630041152263e+21
    

    避免使用 zsh(zcalc 也有类似的问题):

    $ zsh -c 'echo $((12345678901234567890123 + 1))'
    zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1
    -1363962815083169259
    

    我建议你避免expr,它有时需要奇怪的转义:

    $ expr 22 \* 333
    7326
    

    公元前

    下一个级别是(也是 POSIX)bc(RPN 的表亲dc)

    $ echo '22*333' | bc
    7326
    
    $ echo '22 333 * p' | dc
    7326
    

    (历史上)用于实现 bc 并在 2017 年dc 被排除在 POSIX 之外。

    如果您的外壳支持它,则更短:

    $ bc <<<'22*333'
    7326
    

    甚至:

    $ <<<'22*333' bc
    7326
    

    两者都是具有一些内部数学函数的任意精度计算器:

    $ bc <<<2^200
    1606938044258990275541962092341162602522202993782792835301376
    
    $ echo 's(3.1415/2)' | bc -l        # sine function
    .99999999892691403749
    

    awk

    在那些真正基本的计算工具之后,你需要去学习其他语言

    $ awk "BEGIN {print (22*33)/7}"
    103.714
    
    $ perl -E "say 22*33/7"
    103.714285714286
    
    $ python3 -c "print(22*33/7)"
    103.71428571428571
    
    $ php -r 'echo 22*33/7,"\n";'
    103.71428571429
    

    功能

    您可以定义上述任何选项的函数:

    c () 
    { 
        local in="$(echo " $*" | sed -e 's/\[/(/g' -e 's/\]/)/g')";
        gawk -M -v PREC=201 -M 'BEGIN {printf("%.60g\n",'"${in-0}"')}' < /dev/null
    }
    

    并使用:

    $ c 22* 33 /7                   # spaces or not, it doesn't matter.
    103.714285714285714285714285714285714285714285714285714285714
    
    • 41
  3. number9
    2018-11-07T07:15:14+08:002018-11-07T07:15:14+08:00

    阅读本页评论,我看到一个名为的 UNIX/Linux 程序calc完全符合您的要求。如果在 Debian / Ubuntu / 衍生产品上:

    sudo apt-get install apcalc
    

    或在 Fedora Linux 上:

    sudo dnf install calc
    

    那么你也能:

    calc 236-192
    

    如果你alias c='calc'给你的.bashrcor添加一个别名,/etc/bash.bashrc那么它就会变成:

    c 1+1
    

    在命令行上。

    • 28
  4. Stéphane Chazelas
    2018-11-07T07:36:59+08:002018-11-07T07:36:59+08:00

    在zsh:

    $ autoload zcalc # best in  ~/.zshrc
    $ zcalc
    1> 1+1
    2
    2> ^D
    $ zcalc 5+5
    1> 10
    2>
    
    • 18
  5. Sparhawk
    2018-11-07T13:26:44+08:002018-11-07T13:26:44+08:00

    就个人而言,我喜欢libqalculate ( Qalculate的命令行版本)。

    $ qalc
    > 236-192
    
      236 - 192 = 44
    

    虽然界面很简单,但 (lib)qalculate 是一个功能强大、功能齐全的计算器。例如

    > fibonacci(133) to hex
    
      fibonacci(133) = approx. 0x90540BE2616C26F81F876B9
    
    > 100!
    
      factorial(100) = approx. 9.3326215E157
    
    > sin(pi)
    
      sin(pi * radian) = 0
    

    它还可以做一些有用的事情,如制表符补全、必要时打开/关闭括号,并打印其对查询的解释。

    > 18-2)/4
    
      (18 - 2) / 4 = 4
    

    要退出,我只需按Ctrl+ d。

    为了更快地访问,将其设置为类似alias ca='qalc'.

    • 11
  6. CSM
    2018-11-07T12:42:59+08:002018-11-07T12:42:59+08:00

    该units程序虽然不打算用作计算器,但实际上作为一个计算器运行得相当好。

    $ units "236-192"
        Definition: 44
    $ 
    

    如果表达式中有空格,则表达式必须是引号保护的。
    它支持指数和括号的深度嵌套

    • 10
  7. JoL
    2018-11-07T09:41:29+08:002018-11-07T09:41:29+08:00

    我在 zsh 中所做的是:

    $ <<< $(( 236 - 192 ))
    44
    

    在 bash 中,我必须明确提及 cat:

    $ cat <<< $(( 236 - 192 ))
    44
    

    如果我希望结果包含小数位(在 zsh 中工作,而不是在 bash 中),我会在其中一个操作数中添加一个小数点

    $ <<< $(( 236 / 128 )) 
    1
    $ <<< $(( 236. / 128 ))
    1.84375
    
    • 7
  8. Max
    2018-11-07T16:06:30+08:002018-11-07T16:06:30+08:00

    正如对较早回复的评论中所述,标准 shell (ba)sh 允许在$((...)). 我无法仔细检查这是否是 POSIX 标准的一部分,但我确实检查了它是否也适用于 Cygwin 和 Mingw32 shell。

    要查看结果,您确实必须键入echo $((...)),这会使某些字符超过 (interactive use of) bc。但是,要在脚本中使用结果,这很可能会比bc解决方案更短(例如,可能是`echo ...|bc`)。

    关于详细程度,该bc命令允许选择-q抑制"normal GNU bcwelcome"的输出。

    最后,略带边界的评论,让我们注意它bc不仅仅是一个计算器,而是一种成熟的编程语言(包括用户定义的函数、while 和 for 循环等)。另一个事实表明,对于这种简单的计算,更喜欢内置的算术功能,而不是外部程序。也就是说,提取给定分区号的数据并处理“M”、“G”后缀,正如原始问题似乎要求的那样,可能需要(g)awk而不是bc.

    来源:https ://www.gnu.org/software/bc/manual/html_mono/bc.html https://www.gnu.org/software/gawk/manual/html_node/Getting-Started.html

    • 7
  9. Michael Hearn
    2018-11-07T12:54:19+08:002018-11-07T12:54:19+08:00

    Python 在另一个选项卡中打开?

    Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 17:26:49) [MSC v.1900 32 bit (Intel)] on 
    win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> 3+3
    6
    >>>
    
    • 6
  10. Jan M.
    2019-04-25T00:44:36+08:002019-04-25T00:44:36+08:00

    你试过concalc吗?

    说明: 控制台计算器 concalc 是 Linux 控制台的计算器。它只是将 extcalc 的解析器算法打包到一个简单的控制台程序中。如果你的 shell 中需要一个计算器,你可以使用它。concalc 还能够运行用类 C 编程语言编写的脚本。

    $ concalc 1+1
    2
    $ concalc sqrt2
    1.41421356237309505
    

    安装:

    sudo apt-get install concalc
    
    • 4

相关问题

  • 这个命令是如何工作的?mkfifo /tmp/f; 猫/tmp/f | /bin/sh -i 2>&1 | 数控 -l 1234 > /tmp/f

  • FreeBSD 的 sh:列出函数

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • grep -v grep 有什么作用

  • 如何将带有〜的路径保存到变量中?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve