간단한 명령 줄 계산기


19

발행물:

때때로 나는 명령 행 환경에서 간단한 산술을해야한다. 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

expr 236 - 192

여기서 나는 단지 에코 처럼 연산자 전후에 공백 을 입력해야 expr 1+1합니다 1+1.


3
대화 형으로이 작업을 수행하려는 경우, 당신은 입력 할 필요가 없습니다 quitbc; ctrl-D대화 형 프로그램에서와 같이을 누르면 됩니다.
marcelm

2
dc(IMO)가 훨씬 우수합니다 bc.
William Pursell

1
나는 생각 (192), 그리고 236 - - 128 PTN 3과 5 사이의 할당되지 않은 공간이 236이어야 하는가?
Digital Trauma

@DigitalTrauma 좋은 눈! (이것은 단지 예일 뿐이며 아무도 그 점을 발견하지 못했습니다!)
Fabby

1
@JanM. 나는 upvoted 한 사람입니다 .... ;-)
Fabby

답변:


33

다음을 사용하는 것과 관련된 자세한 정보의 양을 크게 줄일 수 있습니다 bc.

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

(쉘이 그것을 지원한다고 가정).

오히려 함수로 사용하려면 다음을 수행하십시오.

$ c() { printf "%s\n" "$*" | bc }
$ c 1+1
2

c항상 사용 가능하게하려면 선호하는 쉘 시작 파일에 정의를 저장하십시오 .


2
bc<RET>236-128<RET>quit<RET>16 번의 키 입력입니다. bc<<<"236-128"<RET>15 번의 키 입력입니다. 내가 "매우 줄어든 입력량"이라고 부르는 것은 아닙니다. :-) 또한 bc으로 종료 할 수 ^D있으므로 첫 번째 옵션은 13 개의 키 스트로크 ( ^D2로 계산) 로 줄어 듭니다 .
L. Levrel

맞습니다. 자세한 내용은 ;-)입니다.
Stephen Kitt

2
@ L.Levrel이 기능을 사용하면 c 1+1내가 필요한 것입니다! :-) (명확하게하기 위해 답변이 업데이트 됨)
Fabby

그리고 부동 소수점을 수행하면 : c 'scale = 2; 17/3 '(또는 더 나은 방법으로,'c () '함수 내에서 사용되는 변수를 스케일링하고 10 진수가 필요할 때마다 값을 정의하십시오. 기본값은 0입니다.)
Olivier Dulac

1
bc -l기능 정의에 사용 하여 기능을 향상 시키십시오.
Isaac

22

껍질

간단한 (경우 CLI에서 CALC는 CLI (쉘) 자체 IFS기본값) :

$ echo $(( 22 + 333 ))
355

공백은 생략 할 수 있습니다.

$ echo $((22*333))
7326

그대로 POSIX의 부분은 거의 모든 쉘은 그것이있다. 그리고 대부분 의 C 언어 수학 기능 이 포함되어 있습니다 (zsh의 우선 순위가 다른 것을 제외하고 C_PRECEDENCES를 설정하여 호환 가능한 값으로 복원).

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

그리고 일부 쉘에는 대부분의 C 언어 수학 구문 (쉼표 포함)이 있습니다.

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

그러나 일부 쉘 에서는 정수 수학 ( 현재 OS에서 일반적으로 2 63 미만 )입니다.

$ echo $((1234/3))
411

$ zsh -c 'echo $((2**63))'
-9223372036854775808

일부 쉘은 부동 수학을 수행 할 수 있습니다.

$ 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

dc 했다 POSIX 그러나 2017 년이 제거되었다 .

쉘이 지원하는 경우 더 짧습니다.

$ bc <<<'22*333'
7326

또는:

$ <<<'22*333' bc
7326

둘 다 내부 수학 함수가있는 임의의 정밀 계산기입니다.

$ bc <<<2^200
1606938044258990275541962092341162602522202993782792835301376

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

어 wk

정말 기본적인 계산 도구를 사용하면 다른 언어로 올라 가야합니다.

$ 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

20

이 페이지를 읽으면 calc정확히 원하는 것을 수행 하는 UNIX / Linux 프로그램이 보입니다 . 데비안 / 우분투 / 파생 상품 인 경우 :

sudo apt-get install apcalc

그럼 당신은 할 수 있습니다 :

calc 236-192

당신이 별칭을 추가 할 경우 alias c='calc'당신에 .bashrc또는 /etc/bash.bashrc그것은 단지가된다 :

c 1+1

명령 행에서.


1
완벽하지는 않지만 공감에 충분합니다. 채팅 및 다운 보트의 오해 가 다른 사용자에 의해 제거 되었습니다 . 내 자신의 (열등한) 답변을 삭제했습니다 ... ;-)
Fabby


9

units프로그램은 계산기로 사용하도록 의도되지 않았지만 실제로는 하나처럼 작동합니다.

$ units "236-192"
    Definition: 44
$ 

식에 공백이 있으면 식을 따옴표로 보호해야합니다.
대괄호의 지수와 깊은 중첩을 지원합니다.


3
: 그것은 다목적의 units -t -d 10 "236GB - 192GB" GB출력 44, units -t -d 15 "236GB - 192GB" bytes출력 44000000000,
AGC

6

이전 답변에 대한 주석에서 언급했듯이 표준 쉘 (ba) sh를 사용하면의 산술 표현식을 평가할 수 있습니다 $((...)). 이것이 POSIX 표준의 일부인지 다시 확인할 수는 없었지만 Cygwin 및 Mingw32 셸에서도 작동하는지 확인했습니다.

결과 를 보려면 실제로을 입력해야 echo $((...))하므로 일부 문자를 (대화식 사용) 이상으로 만듭니다 bc. 그러나 결과를 스크립트 로 사용 하려면 bc솔루션 보다 짧을 것 입니다 (예 :) `echo ...|bc`.

자세한 내용 은 "일반 GNU 환영" 출력을 억제 bc하는 옵션 -q을 허용합니다 .bc

마지막으로 약간 경계선을 긋는 말로 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


감사! 훌륭한 첫 번째 답변! +1
Fabby

2
$((...))산술 확장이라고하며 POSIX의 일부입니다 : pubs.opengroup.org/onlinepubs/9699919799/utilities/… POSIX 쉘의이 기능의 가장 큰 단점은 정수 산술 만 지원한다는 것입니다. (
pabouk

6

내가 zsh에서하는 일은 :

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

bash에서 cat을 명시 적으로 언급해야합니다.

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

결과에 소수를 포함 시키려면 (bash가 아닌 zsh에서 작동) 피연산자 중 하나에 기수 점을 추가합니다

$ <<< $(( 236 / 128 )) 
1
$ <<< $(( 236. / 128 ))
1.84375

7
echo $((236 - 128))작동합니다 ;-).
Stephen Kitt

zsh를 피하십시오 : zsh -c 'print $((12345678901234567890123 + 1))' zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1 -1363962815083169259.
Isaac

@Isaac은 최소한 zsh가 잘립니다. bash는 불평하지 않고 잘못된 답변을 제공합니다.
Stephen Kitt

@StephenKitt zsh의 문제는 하나의 출력 쇼보다 복잡합니다. 비교 : zsh -c 'print $((12345678901234567890123 + 1))'zsh -c 'print $((123456789012345678901 + 1))'. 다른 길이로 잘리고 다른 숫자 결과를 생성합니다.
Isaac

@StephenKitt 대신 Bash는 매뉴얼 (및 부호있는 int의 오버플로에 대한 C 언어)을 따르고 있습니다. 내가 개인적으로 좋아하는 것은 아니지만 문서화되어 있습니다. bash -c 'echo $((1<<63))'``bash -c 'echo $ ((((1 << 63) -1))'를 시도하십시오 .
Isaac

6

개인적으로 저는 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'.


매뉴얼의 TOC를 읽었지만 CLI에 대해 아무것도 찾을 수 없었습니다. (그 동안 +1)
Fabby

1
감사합니다 @Fabby. 혼란스러워서 CLI 부분이 실제로 약간 다릅니다. 명확히하기 위해 답변을 업데이트했습니다.
Sparhawk

나는 당신을 두 번 투표 할 수 있으면 좋겠다! ;-)
Fabby

4

다른 탭에서 파이썬이 열려 있습니까?

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
>>>

아뇨, 실제로는 아니지만 깔끔한 아이디어입니다! :-) +1
Fabby

powershell도 같은 작업을 수행 할 수 있습니다
phuclv

1
@phuclv 네,하지만 아무도 PS를 좋아하지 않습니다
Dev

3
@Dev 톤의 유닉스 사람들은 PS를 좋아합니다
phuclv

2

dc -e '236 192-p'

... 물론 익숙하지 않고 dc두 숫자를 빼는 것 이상이 필요한 경우 보다 친숙한 방법으로 저장하는 것보다 사용 방법 dc(및 일반적으로 RPN) 을 찾는 데 더 많은 시간을 할애 합니다.


예, 데스크 계산기를 3 분 동안 보았는데 그것이 나에게 적합하지 않다는 것을 알았습니다. 저는 HP 학생이 아닌 TI였습니다.
Fabby

2

gradle이 설치되어 있다면 그루비가 있습니다 ...

그루비가 올바르게 진행되면 다음을 사용할 수 있습니다.

groovy -e "println 1+1"

이것은 다른 모든 예제에서 약간 중복되는 것처럼 보일 수 있지만 다음과 같습니다.

  • 그루비는 강력한 언어입니다
  • 가능한 최고의 도서관 지원
  • 강력하고 간단한 수학 함수 (임의의 정밀 수학처럼)
  • 출력에 방향 전환 가능 stdout을 사용하므로 놀랍도록 유연합니다 (백 틱 등이있는 배치 파일 내부에서 사용하는 것이 좋습니다).

Java를 설치하지 않은 경우 아마도 groovy & java를 설치할 가치가 없습니다. groovy가 이미 사용 가능한 경우 옵션 일뿐입니다.


아뇨, 실제로는 아니지만 깔끔한 아이디어입니다! :-) +1
Fabby

2

당신은 concalc 을 시도 습니까?

설명 : 콘솔 계산기 concalc는 Linux 콘솔 용 계산기입니다. 간단한 콘솔 프로그램으로 압축 된 extcalc의 파서 알고리즘 일뿐입니다. 쉘에 계산기가 필요한 경우 사용할 수 있습니다. concalc은 C와 같은 프로그래밍 언어로 작성된 스크립트를 실행할 수도 있습니다.

$ concalc 1+1
2
$ concalc sqrt2
1.41421356237309505

다음을 사용하여 설치 :

sudo apt-get install concalc

1
증거 ... Graged gedaan ... :-D
Fabby

2

다른 훌륭한 답변이 게시되기 전에 다음을 /usr/local/bin/c포함 하는 스크립트 를 만들었습니다 .

#!/bin/sh
IFS=' '               # to be on the safe side, some shells fail to reset IFS.
if [ "$#" -eq 0 ];  then
    echo "$(basename "$0"): a (very) simple calculator."
    echo "type $(basename "$0") expression to evaluate (uses bc internally)"
fi

printf '%s\n' "$*" | bc -l  # safe for most shells
                            # we may use 'bc -l <<<"$*"` for ksh, bash, zsh

그래서 : 타이핑 c 1+1하면 2! :-)

참고 1 : 내가 c찾은 Unix 시스템에 해당 명령이 없기 때문에 사용했습니다 . c 컴파일러에 별칭을 지정했다면 짧고 사용하지 않는 다른 것을 사용하십시오.
참고 2 : 출처


1
(1) 사용 echo "$*" | bc -l했던 shebang 으로 사용하기 로 결정했으며 /bin/shksh / bash / zsh를 사용할 수 있는지 모르겠습니다. (2) 예를 들어`c 'scale = 60; 777/333'을 실행하면 계산 스케일을 변경할 수 있습니다. 희망이 @Fabby을하는 데 도움이
이삭

1

파이썬이 설치되어 있으면 명령 행을 통해 많은 수학적 연산을 수행 할 수 있습니다. 아래에 몇 가지 예를 제공하려고했습니다.

나는 python3당신 이 사용할 수있는 것을 사용했습니다 python. python vs python3 아래의 문제를 피하기 위해 split (fractional) 연산이 발생할 때 python와 차이점이 python3있습니다 .

참고 : 최신의 모든 Linux dist에는 기본적으로 Python 2.7 및 Python 3.5가 모두 제공됩니다. 파이썬을 설치해야하는 경우 여기를 클릭하십시오 .

더하기, 빼기, 곱하기 및 나누기 :

$ python3 <<< "print(12+3)"
15
$ python3 <<< "print(12-3)"
9
$ python3 <<< "print(12*3)"
36
$ python3 <<< "print(12/3)"
4

계수-나눗셈의 나머지 :

$ python3 <<< "print(14%3)"
2

층 구분 :

$ python3 <<< "print(14//3)"
4

지수-x의 거듭 제곱 (x ^ y) :

$ python3 <<< "print(3**2)"
9

제곱근 (예 : √4 = 2) :

$ python3 <<< "print(4**0.5)"
2

더 과학적인 부분은 가져 오기 수학 라이브러리 가 필요 합니다. 전의:

x = log (x)의 자연 로그 :

$ python3 <<< "import math; print(math.log(4))"
1.386294361119890e6

x = log10 (x)의 밑이 10 인 로그 :

$ python3 <<< "import math; print(math.log10(10))"
1.0

계승 (예 : 3! = 3.2.1 = 6) :

$ python3 <<< "import math; print(math.factorial(3))"
6

삼각법 sin(x)- cos(x),, tan(x):

$ python3 <<< "import math; print(math.sin(90))"
0.8939966636005579

더 많은 수학 관련 함수는 여기를 확인하십시오 .

pythonpython3:

나누기 : (부동 사용) :

$ python <<< "print(10.0/3)"
3.33333333333

-대신에

$ python <<< "print(10/3)"
3

또한 직접 터미널을 사용할 수 있습니다.

$ python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+3
4
>>> import math
>>> math.log10(4)
0.6020599913279624
>>> math.sqrt(4)
2.0
>>> 

그게 다야. 행복한 코딩!


0

어느 bcqalc.


자동으로 할 수있는가 bc항상 두 자리로 반올림을 (그것을 실행하는 -l일 물건에 하루 다루기입니다)

당신의 편집 ~/.bashrc:

alias bc="BC_ENV_ARGS=<(echo "scale=2") \bc"

새 쉘을 열고 실행하십시오 bc.


-1

원 라이너 만들기 :

$ c () { echo $(( ${1} )) }

이제 간단한 정수 수학을 사용할 수 있습니다 :

$ c 1+1
2

$ c 25*4
100

$ c 25*4-10
90

$ c 20*5/4
25

이것은 이미 Isaac의 답변 에서 논의되었습니다 .
Stephen Kitt

@StephenKitt 그렇습니다. 나는 Isaac의 매우 자세한 답변을 찬성했습니다. 나는 그가 게시 한 것을 요약 한 원 라이너가 도움이 될 것이라고 생각했습니다. ${1}매개 변수의 사용은 모든 대답에 고유합니다.
WinEunuuchs2Unix

2
다른 답변을 사용하지 않는 이유를 생각해보십시오. ${1};-)
Stephen Kitt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.