İfade kullanarak iki sayı ekleme


13

Şu anda yaptığım BT diploması için Shell betikleri öğreniyorum. Ben verildi öğreticiler birinde gösterildiği gibi iki sayı ekler küçük bir komut dosyası yazmaya çalışıyorum.

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

Ancak yürütme izni verdiğimde ve komut dosyasını çalıştırdığımda bana bu hatayı veriyor.

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

resim açıklamasını buraya girin

Bu Ubuntu ve Fedora üzerinde çalışmayı denedim ama aynı hata oluşur. Biri bana burada neyi kaçırdığımı söyleyebilir mi?


Yanıtlar:


39

Öncelikle ödev için boşluklardan kurtulmalısınız, örn.

sum='expr $num1 + $num2'

o zaman değiştirmek zorunda 'bir etmek `ve hatta daha iyi $():

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

kullanmak yerine exprdoğrudan kabuğunuzda da hesaplama yapabilirsiniz:

sum=$((num1 + num2))

3
exprBunun yerine kullanmak için motivasyon $((...))klasik Bourne kabuğuna taşınabilir olma arzusuysa, bundan kaçınmak iyi bir fikirdir $(...).
Alan Curry

2
@AlanCurry desteklemeyen kabuklar var $()mı? Bildiğim kadarıyla posix tarafından gerekli olduğunu, örneğin tüm posix uyumlu kabukları desteklemelidir$()
Ulrich Dangel

1
@UlrichDangel Orijinal Bourne mermisi yoktu $(…), ama öldü (belki bir yerlerde hala /bin/shSolaris üzerinde çalışıyor ).
Gilles 'SO- kötü olmayı kes'

C Shell $(…)tüm sürümleri desteklemez –– veya en azından desteklemez .
Scott

Değişkenlerin etrafında çift tırnak bulundurmanın amacı nedir?
kojow7

9

Muhtemelen satırda tek tırnak işareti olarak ters tırnakları yanlış okudunuz:

sum = 'expr $num1 + $num2'

Bkz Greg'in Wiki kullanımı hakkında $(...)yerine.

Bu beklendiği gibi çalışır:

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

Ayrıca, eşittir işareti (değişken ataması) etrafında boşluk olmadığını da unutmayın.


1

exprBourne kabuğu (sh) tarafından kullanılan harici bir programdır . Bourne kabuğunun başlangıçta basit aritmetik yapmak için herhangi bir mekanizması yoktu. exprBacktick yardımıyla harici bir program kullanır .

Backtick ( ` ), aslında komut değiştirme olarak adlandırılır. Komut ikamesi, kabuğun belirli bir komut seti gerçekleştirdiği ve ardından çıktılarını komutların yerine ikame ettiği mekanizmadır.

sum=`expr $num1 + $num2`

Gelen Bash aşağıdaki beraber komut dizimi elbette sahiptir (Bourne daha kabuk), bu extrnal programı kullanmaz expr.

sum=$((num1+num2))

harici programı kullanmak istiyorsak expr. aşağıdaki sistaksa sahibiz:

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

ayrıca kod hakkında bir açıklama ekleyin ve soruyu çözmek için nasıl yardımcı olacak?
Tejas

-1

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

-2

Tek bir backtick kullanabilirsiniz ( `anahtar)


1
Bu bir backtick ve bunun $( ... )yerine kabuklarda kullanılması tavsiye edilir . Ayrıca sorun, OP'nin olmaması gereken yerleri kullanmasıdır.
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
Bu soruya cevap vermiyor. Bazı açıklamalar yardımcı olabilir.
Bernhard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.