Învăț scripturi Shell pentru o diplomă în IT pe care o fac în prezent. Încerc să scriu un mic script care să adauge două numere așa cum se arată într-unul din tutorialele care ni s-au dat.
echo "Enter two numbers" read num1 num2 sum = "expr $num1 + $num2" echo "The sum is = $sum"
Cu toate acestea, atunci când îi dau permisiunea de execuție și rulați scriptul, îmi dă această eroare.
sum: =. No such file or directory. sum: expr $num1 + $num2: No such file or directory
Am încercat să rulez atât pe Ubuntu cât și pe Fedora, dar apare aceeași eroare. Poate cineva să-mi spună ce îmi lipsește aici?
Comentarii
- În legătură: unix.stackexchange.com/questions/40786/…
Răspuns
Mai întâi trebuie să scapi de spațiile pentru atribuire, de ex.
sum="expr $num1 + $num2"
atunci trebuie să schimbați "
într-un `
sau chiar mai bine în $()
:
sum=$(expr "$num1" + "$num2")
în loc să utilizați expr
puteți face și calc ulation direct în shell-ul dvs.:
sum=$((num1 + num2))
Comentarii
- Dacă motivația pentru utilizarea
expr
în loc de$((...))
este o dorință de a fi portabil la shell-ul Bourne clasic, atunci ' este o idee bună pentru a evita și$(...)
. - @AlanCurry există cochilii care să nu suporte
$()
? Din câte știu, este cerut de posix, de ex. toate shell-urile compatibile cu posix ar trebui să accepte$()
- @UlrichDangel Shell-ul Bourne original nu ' nu trebuie să aibă
$(…)
, dar a dispărut (poate cineva undeva rulează încă/bin/sh
pe Solaris). - C Shell nu nu acceptă
$(…)
–– sau cel puțin nu toate versiunile. - Care este scopul de a avea ghilimele duble în jurul variabilelor?
Răspuns
Probabil că ați citit greșit backticks-uri ca ghilimele unice în linia:
sum = "expr $num1 + $num2"
Consultați Wiki de Greg despre utilizarea $(...)
în schimb.
funcționează conform așteptărilor:
sum=$(expr "$num1" + "$num2")
De asemenea, rețineți că nu există lacune în jurul semnului egal (atribuirea variabilei).
Răspuns
expr
este un program extern utilizat de Bourne shell (adică SH). Bourne shell nu avea inițial niciun mecanism pentru a efectua aritmetică simplă. Folosește programul extern expr
cu ajutorul backtick.
Backtick ( `) se numește de fapt substituirea comenzilor. Înlocuirea comenzilor este mecanismul prin care shell-ul execută un set dat de comenzi și apoi le substituie ieșirea în locul comenzilor.
sum=`expr $num1 + $num2`
În bash (Bourne din nou shell) are următoarea systax, nu va fi folosit programul extern expr
.
sum=$((num1+num2))
dacă dorim să utilizăm programul extern expr
. avem următorul sistem:
sum=$(expr $num1 + $num2)