ฉันใช้เทอร์มินัลอนุกรมเพื่อป้อนข้อมูลในการทดลองในห้องปฏิบัติการของเรา ฉันพบว่าการใช้
$ echo "5X5"
เพียงส่งคืนสตริงของ"5X5"
. มีคำสั่งในการดำเนินการคูณหรือไม่?
ฉันใช้เทอร์มินัลอนุกรมเพื่อป้อนข้อมูลในการทดลองในห้องปฏิบัติการของเรา ฉันพบว่าการใช้
$ echo "5X5"
เพียงส่งคืนสตริงของ"5X5"
. มีคำสั่งในการดำเนินการคูณหรือไม่?
คำตอบ:
ได้คุณสามารถใช้การขยายเลขคณิตในตัวของ bash$(( ))
เพื่อทำคณิตศาสตร์ง่ายๆ
$ echo "$((5 * 5))"
25
ตรวจสอบส่วนShell Arithmetic ในคู่มืออ้างอิง Bashสำหรับรายการตัวดำเนินการทั้งหมด
เพื่อความสมบูรณ์ตามที่กล่าวไว้อื่น ๆ หากคุณต้องการความแม่นยำตามอำเภอใจbc
หรือdc
จะดีกว่า
สำหรับคณิตศาสตร์ขั้นสูงและแม่นยำยิ่งขึ้นให้พิจารณาใช้ bc (1)
echo "3 * 2.19" | bc -l
6.57
Bash รองรับการขยายเลขคณิตด้วย$(( expression ))
. ตัวอย่างเช่น:
$ echo $(( 5 * 5 ))
25
จำนวนสาธารณูปโภคให้เลขคณิตรวมทั้งBCและexpr
$ echo '5 * 5' | /usr/bin/bc
25
$ /usr/bin/expr 5 \* 5
25
วิธีแก้ปัญหาแบบคลาสสิกคือ:
expr 5 \* 5
อีกทางเลือกหนึ่งที่ดีคือ:
echo 5 5\*p | dc
โซลูชันทั้งสองนี้จะใช้ได้กับตัวถูกดำเนินการจำนวนเต็มเท่านั้น
k
. ฉันจำได้ว่าค่าความแม่นยำเริ่มต้นคือ 0 (การตัดทอนเป็นจำนวนเต็ม) ฉันจำผิดหรือเป็นเพียงการใช้งานที่ใหม่กว่าทำให้พฤติกรรมเปลี่ยนไป?
dc
ไม่ค่อยได้ใช้ในช่วงหลายปีที่ผ่านมาเนื่องจากฉันมีพีชคณิตมากขึ้นและมี RPN น้อยกว่าดังนั้นฉันจึงจำไม่ได้ ในระบบ GNU ที่ฉันใช้ค่าเริ่มต้นคือ 0 man
หน้า FreeBSD เก่า (1993) กล่าวถึงค่าเริ่มต้นเป็นศูนย์ แต่man
หน้า BSD รุ่นเก่าไม่ทำ
echo '4 k 50.5 7 / p' | dc
งาน (เอาท์พุท: 7.2142
)
ฟังก์ชันเชลล์อย่างง่าย (ไม่จำเป็นต้องใช้ sed) ควรใช้กลอุบายในการตีความ '5X5'
$ function calc { bc -l <<< ${@//[xX]/*}; };
$ calc 5X5
25
$ calc 5x5
25
$ calc '5*5'
25
ฉันใช้ฟังก์ชันนี้ซึ่งใช้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
ฉันมีสคริปต์ง่ายๆที่ใช้สำหรับสิ่งนี้:
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'
(คุณยังคงต้องใช้เครื่องหมายคำพูดหากนิพจน์มีวงเล็บ)tr
สามารถใช้เพื่อทำการแมปอักขระสำหรับอักขระหลายตัว
หากคุณชอบ 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
dc
ใช้งานได้กับโฟลต ลองecho '4 k 50 7 / p' | dc
. ผลลัพธ์คือ7.1428
.k
คำสั่งตั้งค่าความแม่นยำ