日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux脚本写的计算器,一步步打造自己的linux命令行计算器

發布時間:2024/7/23 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux脚本写的计算器,一步步打造自己的linux命令行计算器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

相信很多人,在工作中會需要使用到計算器。一般的做法是,打開并使用系統自帶的計算器。

這種做法可能對我來說,有如下幾個問題。

太慢。每次需要打開計算器,然后改成編程模式,手工選擇進制,再使用輸入表達式進行計算。

需要切換窗口。編程時經常是在終端中,使用GUI計算器則意味著要離開終端,計算完畢再切換回來。

無法使用混合進制表達式。混合進制的意思是,在一個表達式中同時使用多種進制,如“0x10 * 10”表示十六進制的0x10乘以十進制的10。

如果以上有一條你也有同感的話,那么你也應該試一下,使用命令行計算器。

命令行計算器,調用bc

只需經過簡單的搜索,便可以了解到,linux中原生提供了一個命令行計算器 GNU bc。

GNU bc支持高精度數字和多種數值類型(例如二進制、十進制、十六進制)的輸入輸出。

bc的交互式使用方式,運行bc,進入交互模式。在交互模式中輸入表達式,回車即可獲得結果。需要退出時輸入quit退出即可。

bc的非交互式使用方式,通過管道將表達式傳入。

使用效果如下

zhuangqiubin@zhuangqiubin-PC:~$ bc

bc 1.07.1

Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.

This is free software with ABSOLUTELY NO WARRANTY.

For details type `warranty'.

1+2

3

quit

zhuangqiubin@zhuangqiubin-PC:~$ echo "1+2" | bc

3

OK,get到了命令行計算器的新技能了,但每次進入交互模式或者手工輸入“echo 表達式 | bc ”都感覺略麻煩。那這個時候,就需要腳本,寫個mycalc.sh好了

zhuangqiubin@zhuangqiubin-PC:~$ cat mycalc.sh

#!/bin/bash

echo "$@" | bc

zhuangqiubin@zhuangqiubin-PC:~$ ./mycalc.sh 1+2

3

再把mycalc.sh拷貝到可訪問的目錄下,如

sudo mv mycalc.sh /usr/bin

對于沒有sudo權限的情況,那也可以變通下

mkdir -p ~/usr/bin

mv mycalc.sh ~/usr/bin

echo 'export PATH=$HOME/usr/bin:$PATH' >> ~/.bashrc

source ~/.bashrc

再alias一個順手的命令名,比如拼音jisuan

echo "alias jisuan='mycalc.sh'" >> ~/.bashrc

更多bc的用法,可以通過man bc查看,網上也有許多介紹資料。

解決進制問題

bc仍然需要手工指定進制,在表達式前,使用ibase參數和obase參數指定輸入輸出的進制。并且不支持混合進制,因為ibase每次只能指定一種進制。

zhuangqiubin@zhuangqiubin-PC:~$ echo "10+10" | bc

20

zhuangqiubin@zhuangqiubin-PC:~$ echo "ibase=16;10+10" | bc

32

但我們既然已經有了一個包裝腳本mycalc.sh,那是不是可以把進制轉換的工作交給它呢,當然可以。

我們可以讓mycalc.sh先處理下表達式中的數字,約定0x開頭為十六進制,不帶前綴為十進制,0o開頭為八進制,0b開頭為二進制。

mycalc先將所有參數轉換成統一的進制,如十進制,然后計算表達式的值,最終將結果再以多種進制的形式輸出。這樣我們就不同手工處理進制問題了。

至于輸出,為了方便起見,可以多種進制一起輸出,需要哪個用哪個即可

使用示例

zhuangqiubin@zhuangqiubin-PC:~$ type jisuan

jisuan 是 `~/mywork/mygithub/smartbc/smartbc' 的別名

zhuangqiubin@zhuangqiubin-PC:~$ jisuan 10+10

Original EQUATION: 10+10

Decimal EQUATION: 10+10

base2 : 10100

base8 : 24

base10: 20

base16: 14

zhuangqiubin@zhuangqiubin-PC:~$ jisuan 10+0x10

Original EQUATION: 10+0x10

Decimal EQUATION: 10+16

base2 : 11010

base8 : 32

base10: 26

base16: 1A

更好的實現,使用python

以上基于bc的計算器,已經可以滿足我的需求了,也使用了一段時間。但其實還有更好的實現方式,使用python。

在命令行中,輸入python,進入交互模式,即可像bc一樣執行表達式,得到結果。更棒的是,原生支持混合進制,不需要自己寫代碼預處理表達式了。簡單可靠。

代碼及使用示例

zhuangqiubin@zhuangqiubin-PC:~$ type jisuan

jisuan 是 `~/.pycalc.py' 的別名

zhuangqiubin@zhuangqiubin-PC:~$ cat ~/.pycalc.py

#!/usr/bin/env python2

import sys

equation=sys.argv[1]

result=eval(equation)

if isinstance(result, (float)):

print "Attention:only base10 is float, others change to int before type"

print "equation:",sys.argv[1]

print "base2 : ",str(bin(int(result)))

print "base8 : ",str(oct(int(result)))

print "base10: ",str((result))

print "base16: ",str(hex(int(result)))

zhuangqiubin@zhuangqiubin-PC:~$ jisuan 10+10

equation: 10+10

base2 : 0b10100

base8 : 024

base10: 20

base16: 0x14

zhuangqiubin@zhuangqiubin-PC:~$ jisuan 10+0x10

equation: 10+0x10

base2 : 0b11010

base8 : 032

base10: 26

base16: 0x1a

更多輸出格式

一般,輸出十六進制,十進制,二進制三種結果就足夠用了。但如果有特殊需求,也可自己拓展。

比如,當需要核對寄存器,檢查某個bit時,一個個去數二進制的第19位,是很費眼睛的一件事。

這個時候就需要更加直觀的輸出,可以一眼看到某個bit是0還是1。

那好辦,給二進制加上下標好了。如下

代碼

#!/usr/bin/env python2

import sys

def formatBinString(num):

result='bit: '

result_index='index: '

num_len=len(num)

if num_len > 32:

return ""

for i in num:

num_len-=1

result+=i

result+=' | '

result_index+=str(num_len).zfill(2)

result_index+='| '

return result+'\n'+result_index

equation=sys.argv[1]

result=eval(equation)

if isinstance(result, (float)):

print "Attention:only base10 is float, others change to int before type"

print "equation:",sys.argv[1]

print ""

print "base2 : ",str(bin(int(result)))

print "base8 : ",str(oct(int(result)))

print "base10: ",str((result))

print "base16: ",str(hex(int(result)))

print ""

print formatBinString(str(bin(int(result))[2:].zfill(32)))

效果

zhuangqiubin@zhuangqiubin-PC:~$ jisuan 10+0x10

equation: 10+0x10

base2 : 0b11010

base8 : 032

base10: 26

base16: 0x1a

bit: 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |

index: 31| 30| 29| 28| 27| 26| 25| 24| 23| 22| 21| 20| 19| 18| 17| 16| 15| 14| 13| 12| 11| 10| 09| 08| 07| 06| 05| 04| 03| 02| 01| 00|

總結

以上是生活随笔為你收集整理的linux脚本写的计算器,一步步打造自己的linux命令行计算器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: wwwwww日本| а√天堂资源在线 | 国产精品一 | 国产乱论 | 福利网站在线观看 | 久久精品观看 | 学生调教贱奴丨vk | 污视频在线 | 自拍毛片 | 日韩精品电影在线 | 中文在线不卡 | 亚洲一区二区高清 | 99久热| 国产在线精品一区二区三区 | 午夜国产一级 | 国产aⅴ| 极品色av | 女同一区| 免费国产一区二区三区 | 九九热免费在线视频 | 欧美最猛黑人xxxx黑人猛交 | 久久av在线 | 成人国产精品久久久网站 | 丝袜av在线播放 | 我的好妈妈在线观看 | 91色啪 | 欧美9999| 涩涩在线观看 | 国产日产亚洲系列最新 | 色狠狠干 | 伊人伊人鲁 | 黄色免费看片 | 日韩aⅴ在线观看 | 丁香婷婷一区二区三区 | 美女黄色av | 国产精选久久 | 日日碰狠狠添天天爽 | 冲田杏梨一区二区三区 | 久久调教| 日本精品三区 | 色播在线播放 | 亚洲av无一区二区三区久久 | 国产男女精品 | 亚洲欧美一区在线 | 国产精品4区 | 色婷婷av久久久久久久 | 96av在线| 免费成人av片 | 久久国产精品二区 | 自拍日韩亚洲一区在线 | 欧美性白人极品1819hd | av在线天堂 | 美女福利视频一区 | 小伸进喷水网站 | 人人草人人澡 | 欧美视频免费在线观看 | 精品无码一区二区三区在线 | 成人无遮挡 | www.久久网 | 中文av一区 | 国产喷水在线 | 亚州黄色 | 都市激情中文字幕 | 欧美激情一区二区三区在线 | 综合激情av| 99视频国产精品 | 欧美一区二区久久 | 波多野结衣高清电影 | 日韩欧美中文字幕在线视频 | 日本一级网站 | 中文字幕一级二级三级 | 韩日视频在线 | 免费看女生隐私 | 成人爽a毛片一区二区免费 日本高清免费看 | 国产精品久久久久久久久毛片 | 欧美中文字幕一区 | 欧美另类z0z变态 | 麻豆视频污 | 国产三级在线免费 | 欧美性爱视频久久 | 国产乱叫456在线 | 琪琪色综合网 | 老子午夜影院 | 男男av网站 | jizz中国少妇高潮出水 | 99国产视频 | 少妇人禽zoz0伦视频 | 色哟哟国产精品 | 男女啪啪免费看 | 在线观看中文字幕一区 | 欧美综合精品 | www.五月天com | 性感美女福利视频 | 日本精品免费在线观看 | 欧美xxxxx自由摘花 | 九九亚洲 | 亚洲成a人v欧美综合天堂麻豆 | 久久爱资源网 | 欧美日韩1区 |