การคูณบนเทอร์มินัลบรรทัดคำสั่ง


115

ฉันใช้เทอร์มินัลอนุกรมเพื่อป้อนข้อมูลในการทดลองในห้องปฏิบัติการของเรา ฉันพบว่าการใช้

$ echo "5X5"

เพียงส่งคืนสตริงของ"5X5". มีคำสั่งในการดำเนินการคูณหรือไม่?

คำตอบ:


208

ได้คุณสามารถใช้การขยายเลขคณิตในตัวของ bash$(( ))เพื่อทำคณิตศาสตร์ง่ายๆ

$ echo "$((5 * 5))"
25

ตรวจสอบส่วนShell Arithmetic ในคู่มืออ้างอิง Bashสำหรับรายการตัวดำเนินการทั้งหมด

เพื่อความสมบูรณ์ตามที่กล่าวไว้อื่น ๆ หากคุณต้องการความแม่นยำตามอำเภอใจbcหรือdcจะดีกว่า


45

สำหรับคณิตศาสตร์ขั้นสูงและแม่นยำยิ่งขึ้นให้พิจารณาใช้ bc (1)

echo "3 * 2.19" | bc -l 
6.57


15

วิธีแก้ปัญหาแบบคลาสสิกคือ:

 expr 5 \* 5

อีกทางเลือกหนึ่งที่ดีคือ:

 echo 5 5\*p | dc

โซลูชันทั้งสองนี้จะใช้ได้กับตัวถูกดำเนินการจำนวนเต็มเท่านั้น


1
dcใช้งานได้กับโฟลต ลองecho '4 k 50 7 / p' | dc. ผลลัพธ์คือ7.1428. kคำสั่งตั้งค่าความแม่นยำ
หยุดชั่วคราวจนกว่าจะมีประกาศอีกครั้ง

@ เดนนิสในการใช้งาน dc สองแบบที่แตกต่างกันฉันเห็นว่าการดำเนินการลอยทำงานได้โดยไม่ต้องมอบหมายผ่านk. ฉันจำได้ว่าค่าความแม่นยำเริ่มต้นคือ 0 (การตัดทอนเป็นจำนวนเต็ม) ฉันจำผิดหรือเป็นเพียงการใช้งานที่ใหม่กว่าทำให้พฤติกรรมเปลี่ยนไป?
William Pursell

ฉันdcไม่ค่อยได้ใช้ในช่วงหลายปีที่ผ่านมาเนื่องจากฉันมีพีชคณิตมากขึ้นและมี RPN น้อยกว่าดังนั้นฉันจึงจำไม่ได้ ในระบบ GNU ที่ฉันใช้ค่าเริ่มต้นคือ 0 manหน้า FreeBSD เก่า (1993) กล่าวถึงค่าเริ่มต้นเป็นศูนย์ แต่manหน้า BSD รุ่นเก่าไม่ทำ
หยุดชั่วคราวจนกว่าจะมีประกาศอีกครั้ง

อย่างไรก็ตาม (สำหรับผู้อ่านในอนาคต) ตัวอย่างของฉันควรแสดงตัวถูกดำเนินการที่ไม่ใช่จำนวนเต็มแทนที่จะเป็นเพียงผลลัพธ์ที่ไม่ใช่จำนวนเต็มเพื่อที่จะตอบโต้การยืนยันได้อย่างถูกต้อง ไม่เคยกลัวecho '4 k 50.5 7 / p' | dcงาน (เอาท์พุท: 7.2142)
หยุดชั่วคราวจนกว่าจะมีประกาศอีกครั้ง

8

ฟังก์ชันเชลล์อย่างง่าย (ไม่จำเป็นต้องใช้ sed) ควรใช้กลอุบายในการตีความ '5X5'

$ function calc { bc -l <<< ${@//[xX]/*}; };
$ calc 5X5
25
$ calc 5x5
25
$ calc '5*5'
25

6

ฉันใช้ฟังก์ชันนี้ซึ่งใช้bcและรองรับการคำนวณจุดลอยตัว:

c () { 
    local a
    (( $# > 0 )) && a="$@" || read -r -p "calc: " a
    bc -l <<< "$a"
}

ตัวอย่าง:

$ c '5*5'
25
$ c 5/5
1.00000000000000000000
$ c 3.4/7.9
.43037974683544303797

การขยายเลขคณิตของ Bash ไม่รองรับการลอยตัว (แต่ Korn เชลล์และ zsh ทำ)

ตัวอย่าง:

$ ksh -c 'echo "$((3.0 / 4))"'
0.75

4

ฉันมีสคริปต์ง่ายๆที่ใช้สำหรับสิ่งนี้:

me@mycomputer:~$ cat /usr/local/bin/c

#!/bin/sh

echo "$*" | sed 's/x/\*/g' | bc -l

มันเปลี่ยนxเป็น*ตั้งแต่*เป็นอักขระพิเศษในเชลล์ ใช้มันดังนี้:

  • c 5x5
  • c 5-4.2 + 1
  • c '(5 + 5) * 30' (คุณยังคงต้องใช้เครื่องหมายคำพูดหากนิพจน์มีวงเล็บ)

ฉันชอบความคิดของคุณที่จะใช้ "x" ในการคูณ คุณสามารถใช้วงเล็บเหลี่ยมแทนวงเล็บเพื่อหลีกเลี่ยงความจำเป็นในการอ้างอิง trสามารถใช้เพื่อทำการแมปอักขระสำหรับอักขระหลายตัว
หยุดชั่วคราวจนกว่าจะมีประกาศอีกครั้ง

3

หากคุณชอบ python และมีตัวเลือกในการติดตั้งแพ็คเกจคุณสามารถใช้ยูทิลิตี้นี้ที่ฉันสร้างขึ้น

# install pythonp
python -m pip install pythonp

pythonp "5*5"
25

pythonp "1 / (1+math.exp(0.5))"
0.3775406687981454

# define a custom function and pass it to another higher-order function
pythonp "n=10;functools.reduce(lambda x,y:x*y, range(1,n+1))"     
3628800
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.