Aggiunta di due numeri usando expr


13

Sto imparando lo scripting Shell per un diploma in IT che sto attualmente facendo. Sto cercando di scrivere un piccolo script che aggiunge due numeri, come mostrato in uno dei tutorial che ci sono stati dati.

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

Tuttavia, quando gli do il permesso di esecuzione ed eseguo lo script, mi dà questo errore.

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

inserisci qui la descrizione dell'immagine

Ho provato a eseguirlo su Ubuntu e Fedora ma si verifica lo stesso errore. Qualcuno può dirmi cosa mi manca qui?


Risposte:


39

Per prima cosa devi liberarti degli spazi per il compito, ad es

sum='expr $num1 + $num2'

allora devi passare 'a un `o anche meglio a $():

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

invece di usare exprpuoi anche fare il calcolo direttamente nella tua shell:

sum=$((num1 + num2))

3
Se la motivazione per usare al exprposto di $((...))è il desiderio di essere portabile sulla classica shell Bourne, allora è una buona idea evitare $(...)anche.
Alan Curry

2
@AlanCurry ci sono shell che non supportano $()? Per quanto ne so è richiesto da posix, ad esempio tutte le shell compatibili con posix dovrebbero supportare$()
Ulrich Dangel

1
@UlrichDangel La shell Bourne originale non aveva $(…), ma si è quasi estinta (forse qualcuno da qualche parte sta ancora eseguendo /bin/shSolaris).
Gilles 'SO- smetti di essere malvagio'

La shell C non supporta $(…)–– o almeno, non tutte le versioni.
Scott,

Qual è lo scopo di avere virgolette doppie attorno alle variabili?
kojow7,

9

Probabilmente hai letto erroneamente i backtick come virgolette singole nella riga:

sum = 'expr $num1 + $num2'

Vedi invece il Wiki di Greg sull'uso $(...).

Funziona come previsto:

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

Si noti inoltre che non vi sono spazi vuoti attorno al segno di uguale (l'assegnazione variabile).


1

exprè un programma esterno utilizzato dalla shell Bourne (cioè sh). La shell Bourne non aveva originariamente alcun meccanismo per eseguire semplici aritmetiche. Utilizza exprun programma esterno con l'aiuto di backtick.

Il backtick ( ` ) è in realtà chiamato sostituzione del comando. La sostituzione dei comandi è il meccanismo mediante il quale la shell esegue un determinato set di comandi e quindi sostituisce il loro output al posto dei comandi.

sum=`expr $num1 + $num2`

In bash (bourne again shell) ha il seguente systax, non utilizzerà il programma extrnal expr.

sum=$((num1+num2))

se vogliamo usare il programma esterno expr. abbiamo il seguente 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

aggiungere anche una descrizione del codice e in che modo aiuterà a risolvere la domanda?
Tejas,

-1

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

-2

È possibile utilizzare un singolo backtick (la `chiave)


1
È un backtick e si consiglia di utilizzare $( ... )invece nelle shell. Inoltre, il problema è che OP utilizza spazi dove non dovrebbero.
vonbrand

-2
echo a 
read a
echo b
read b
c=`expr $a + $b`
echo $c

-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
Questo non risponde alla domanda. Qualche spiegazione sarebbe d'aiuto.
Bernhard,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.