การเพิ่มตัวเลขสองตัวโดยใช้ expr


13

ฉันกำลังเรียนรู้การเขียนสคริปต์ของเชลล์เพื่อรับประกาศนียบัตรด้านไอทีที่ฉันกำลังทำอยู่ ฉันกำลังพยายามเขียนสคริปต์ขนาดเล็กที่เพิ่มตัวเลขสองตัวตามที่แสดงในหนึ่งในบทเรียนที่เราได้รับ

echo "Enter two numbers"
read num1 num2
sum = 'expr $num1 + $num2'
echo "The sum is = $sum"

อย่างไรก็ตามเมื่อฉันให้สิทธิ์การดำเนินการและเรียกใช้สคริปต์มันทำให้ฉันมีข้อผิดพลาดนี้

sum: =. No such file or directory.
sum: expr $num1 + $num2: No such file or directory

ป้อนคำอธิบายรูปภาพที่นี่

ฉันลองใช้งานทั้ง Ubuntu และ Fedora แต่เกิดข้อผิดพลาดเดียวกัน ใครช่วยกรุณาบอกฉันว่าฉันหายไปที่นี่


ที่เกี่ยวข้อง: unix.stackexchange.com/questions/40786/…
Bernhard

คำตอบ:


39

ก่อนอื่นคุณต้องกำจัดช่องว่างสำหรับการมอบหมายเช่น

sum='expr $num1 + $num2'

จากนั้นคุณต้องเปลี่ยน'เป็น`หรือดีกว่า$():

sum=$(expr "$num1" + "$num2")

แทนที่จะใช้exprคุณยังสามารถทำการคำนวณโดยตรงในเปลือกของคุณ:

sum=$((num1 + num2))

3
หากแรงจูงใจในการใช้งานexprแทนที่จะ$((...))เป็นความปรารถนาที่จะพกพาไปสู่ ​​Bourne shell แบบคลาสสิกก็เป็นความคิดที่ดีที่จะหลีกเลี่ยง$(...)เช่นกัน
Alan Curry

2
@AlanCurry มีเปลือกหอยใด ๆ ที่ไม่สนับสนุน$()? เท่าที่ฉันรู้ว่ามันเป็นสิ่งจำเป็นโดย posix เช่นเปลือกหอยที่รองรับ posix ทุกคนควรได้รับการสนับสนุน$()
Ulrich Dangel

1
@UlrichDangel เชลล์ Bourne ดั้งเดิมไม่ได้มี$(…)แต่มันเกี่ยวกับการตายออก (อาจมีบางคนยังคงทำงาน/bin/shบน Solaris)
Gilles 'หยุดความชั่วร้าย' ใน

C Shell ไม่รองรับ$(…)- - หรืออย่างน้อยไม่ใช่ทุกรุ่น
สกอตต์

วัตถุประสงค์ของการมีคำพูดสองครั้งรอบตัวแปรคืออะไร?
kojow7

9

คุณอาจอ่านผิด backticks เป็นคำพูดเดียวในบรรทัด:

sum = 'expr $num1 + $num2'

ดูWiki ของ Gregในการใช้$(...)แทน

ทำงานได้ตามที่คาดไว้:

sum=$(expr "$num1" + "$num2")

โปรดทราบว่าไม่มีช่องว่างรอบเครื่องหมายเท่ากับ (การกำหนดตัวแปร)


1

exprเป็นโปรแกรมภายนอกที่ใช้โดยBourne shell (เช่น sh) บอร์นเชลล์ไม่ได้มีกลไกใด ๆ ในการคำนวณทางคณิตศาสตร์อย่างง่าย มันใช้exprโปรแกรมภายนอกด้วยความช่วยเหลือของ backtick

backtick ( ` ) จริง ๆ แล้วเรียกว่าการทดแทนคำสั่ง การทดแทนคำสั่งเป็นกลไกที่เชลล์ดำเนินการชุดคำสั่งที่กำหนดจากนั้นแทนที่เอาต์พุตในตำแหน่งของคำสั่ง

sum=`expr $num1 + $num2`

ในทุบตี (Bourne Again Shell) ก็มี Systax exprต่อไปนี้ก็จะไม่ใช้โปรแกรม

sum=$((num1+num2))

exprถ้าเราต้องการที่จะใช้โปรแกรมภายนอก เรามี systax ต่อไปนี้:

sum=$(expr $num1 + $num2)


-1
#!/bin/bash
function add()
{
sum=`expr $a + $b`
echo "Sum is :$sum";
}

echo "Enter the value of a";
read a
echo "Enter the valure of b";
read b
add

เพิ่มคำอธิบายบางอย่างเกี่ยวกับโค้ดและจะช่วยแก้ปัญหาได้อย่างไร
Tejas


-2

คุณสามารถใช้ backtick เดียว ( `ปุ่ม)


1
มันเป็น backtick และแนะนำให้ใช้$( ... )แทนในกระสุน นอกจากนี้ปัญหาคือ OP ใช้ช่องว่างที่ไม่ควร
vonbrand


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.