Thêm hai số bằng expr


13

Tôi đang học kịch bản Shell để lấy bằng tốt nghiệp CNTT. Tôi đang cố gắng viết một kịch bản nhỏ có thêm hai số như thể hiện trong một trong những hướng dẫn mà chúng tôi đã đưa ra.

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

Tuy nhiên, khi tôi cấp cho nó quyền thực thi và chạy tập lệnh, nó sẽ báo lỗi cho tôi.

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

nhập mô tả hình ảnh ở đây

Tôi đã thử chạy nó trên cả Ubuntu và Fedora nhưng cùng một lỗi xảy ra. Bất cứ ai có thể xin vui lòng cho tôi biết những gì tôi đang thiếu ở đây?


Câu trả lời:


39

Trước tiên, bạn phải loại bỏ khoảng trắng cho bài tập, vd

sum='expr $num1 + $num2'

sau đó bạn phải thay đổi 'thành một `hoặc thậm chí tốt hơn để $():

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

thay vì sử dụng, exprbạn cũng có thể thực hiện phép tính trực tiếp trong trình bao của mình:

sum=$((num1 + num2))

3
Nếu động lực để sử dụng exprthay vì $((...))mong muốn được mang theo vỏ Bourne cổ điển, thì đó cũng là một ý tưởng tốt để tránh $(...).
Alan Curry

2
@AlanCurry có shell nào không hỗ trợ $()không? Theo như tôi biết thì nó được yêu cầu bởi posix, ví dụ như tất cả các shell tương thích posix nên hỗ trợ$()
Ulrich Dangel

1
@UlrichDangel Vỏ Bourne ban đầu không có $(…), nhưng nó đã chết (có lẽ ai đó vẫn đang chạy /bin/shtrên Solaris).
Gilles 'SO- ngừng trở nên xấu xa'

C Shell không hỗ trợ $(…)các phiên bản hay nhất, không phải tất cả các phiên bản.
Scott

Mục đích của việc có dấu ngoặc kép xung quanh các biến là gì?
kojow7

9

Bạn có thể đã đọc sai backticks dưới dạng dấu ngoặc đơn trong dòng:

sum = 'expr $num1 + $num2'

Xem Wiki của Greg về việc sử dụng $(...)thay thế.

Điều này hoạt động như mong đợi:

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

Cũng lưu ý rằng không có khoảng trống xung quanh dấu bằng (phép gán biến).


1

exprlà một chương trình bên ngoài được sử dụng bởi Bourne shell (tức là sh). Vỏ Bourne ban đầu không có bất kỳ cơ chế nào để thực hiện số học đơn giản. Nó sử dụng exprchương trình bên ngoài với sự trợ giúp của backtick.

Backtick ( ` ) thực sự được gọi là thay thế lệnh. Thay thế lệnh là cơ chế mà shell thực hiện một tập lệnh đã cho và sau đó thay thế đầu ra của chúng ở vị trí của các lệnh.

sum=`expr $num1 + $num2`

Trong bash (bourne again shell) nó có systax sau, nó sẽ không sử dụng chương trình extrnal expr.

sum=$((num1+num2))

nếu chúng ta muốn sử dụng chương trình bên ngoài expr. chúng tôi có hệ thống sau:

sum=$(expr $num1 + $num2)

0

Nếu bạn đang sử dụng bash, bạn có thể làm một cái gì đó như thế này:

sum=$((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

cũng thêm một số mô tả về mã và nó sẽ giúp giải quyết câu hỏi như thế nào?
Tejas

-1

echo "enter first no :"; read a
echo "enter second no :"; read b
echo "sum = `expr $a + $b`"

-2

Bạn có thể sử dụng một backtick duy nhất ( `phím)


1
Nó là một backtick, và nên sử dụng $( ... )thay thế trong vỏ. Bên cạnh đó, vấn đề là OP sử dụng không gian nơi họ không nên.
vonbrand


-3
echo "addition of two number"

echo "enter a number"
read a
echo "enter a number"
read b

c=`expr $a + $b`

echo $c

3
Đây không phải là trả lời câu hỏi. Một số giải thích sẽ giúp.
Bernhard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.