Sto imparando lo scripting Shell per un diploma in informatica che sto attualmente facendo. Sto cercando di scrivere un piccolo script che aggiunga 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 autorizzazione di esecuzione ed esecuzione dello script, mi dà questo errore.
sum: =. No such file or directory. sum: expr $num1 + $num2: No such file or directory
Ho provato a eseguirlo sia su Ubuntu che su Fedora ma si è verificato lo stesso errore. Qualcuno può dirmi cosa mi manca qui?
Commenti
- Correlati: unix.stackexchange.com/questions/40786/…
Risposta
Per prima cosa devi eliminare gli spazi per il compito, ad esempio
sum="expr $num1 + $num2"
quindi devi cambiare "
in `
o anche meglio in $()
:
sum=$(expr "$num1" + "$num2")
invece di utilizzare expr
puoi anche eseguire il calcolo ulation direttamente nella tua shell:
sum=$((num1 + num2))
Commenti
Risposta
Probabilmente hai letto male i backtick come virgolette singole nella riga:
sum = "expr $num1 + $num2"
Consulta la Wiki di Greg sullutilizzo di $(...)
.
Questo funziona come previsto:
sum=$(expr "$num1" + "$num2")
Nota inoltre che non ci sono spazi vuoti intorno al segno di uguale (lassegnazione della variabile).
La risposta
expr
è un programma esterno utilizzato da Bourne shell (ad es. sh). La Bourne Shell originariamente non aveva alcun meccanismo per eseguire semplici operazioni aritmetiche. Utilizza expr
programma esterno con laiuto di backtick.
Il backtick ( `) è effettivamente chiamata sostituzione dei comandi. La sostituzione dei comandi è il meccanismo mediante il quale la shell esegue un determinato insieme di comandi e quindi sostituisce il loro output nel luogo dei comandi.
sum=`expr $num1 + $num2`
In bash (bourne again shell) ha il seguente systax, non utilizzerà il programma esterno expr
.
sum=$((num1+num2))
se vogliamo utilizzare il programma esterno expr
. abbiamo il seguente systax:
sum=$(expr $num1 + $num2)
expr
invece di$((...))
è un desiderio di essere portabile con la classica Bourne Shell, quindi ' una buona idea per evitare anche$(...)
.$()
? Per quanto ne so è richiesto da posix, ad es. tutte le shell compatibili con posix dovrebbero supportare$()
$(…)
, ma è quasi estinto (forse qualcuno da qualche parte sta ancora eseguendo/bin/sh
su Solaris).$(…)
–– o almeno non tutte le versioni.