질문:
때때로 명령줄 환경에서 간단한 산술 연산을 수행해야 합니다. 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
$
만약에표현에 공백이 있고,그런 다음 표현식을 인용해야 합니다.
지수와 괄호의 깊은 중첩을 지원합니다.