일반화하다

일반화하다

질문:

때때로 명령줄 환경에서 간단한 산술 연산을 수행해야 합니다. 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

어디로 들어가야 해?공간before 및 after 연산자 도 expr 1+1마찬가지로 에코입니다 1+1.

답변1

다음을 사용할 때 관련된 자세한 내용을 줄일 수 있습니다 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정의를 항상 사용할 수 있도록 하려면 즐겨찾는 셸 시작 파일에 정의를 저장하세요.

답변2

일반화하다

여러 솔루션이 나열됩니다(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의 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

그러나 일부 쉘에서는 단지 정수 수학일 뿐입니다( 현재 운영 체제에서는 일반적으로 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 예전에는(역사적으로) bc를 구현하는 데 사용되었으며2017년 POSIX에서 제외됨.

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

$ bc <<<'22*333'
7326

심지어:

$ <<<'22*333' bc
7326

둘 다 일부 내부 수학 기능을 갖춘 임의 정밀 계산기입니다.

$ bc <<<2^200
1606938044258990275541962092341162602522202993782792835301376

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

정말 그 이후에는기초적인계산 도구를 사용하려면 다른 언어로 업그레이드해야 합니다.

$ 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

답변3

읽다이 페이지의 댓글calc, 나는 당신이 원하는 것을 정확히 수행하는 UNIX/Linux라는 프로그램을 보았습니다 . Debian/Ubuntu/파생 프로그램의 경우:

sudo apt-get install apcalc

또는 Fedora Linux의 경우:

sudo dnf install calc

그런 다음 다음을 수행할 수 있습니다.

calc 236-192

alias c='calc'또는 에 .bashrc별칭을 추가 하면 /etc/bash.bashrc다음과 같이 됩니다.

c 1+1

명령줄에서.

답변4

이것units이 프로그램은 계산기로 사용하도록 고안된 것은 아니지만 실제로는 계산기로 꽤 잘 작동합니다.

$ units "236-192"
    Definition: 44
$ 

만약에표현에 공백이 있고,그런 다음 표현식을 인용해야 합니다.
지수와 괄호의 깊은 중첩을 지원합니다.

관련 정보