Ik ben Shell-scripts aan het leren voor een diploma in IT dat ik momenteel aan het doen ben. Ik probeer een klein script te schrijven dat twee getallen toevoegt, zoals weergegeven in een van de tutorials die we kregen.
echo "Enter two numbers" read num1 num2 sum = "expr $num1 + $num2" echo "The sum is = $sum"
Maar als ik het de uitvoeringstoestemming en voer het script uit, het geeft me deze fout.
sum: =. No such file or directory. sum: expr $num1 + $num2: No such file or directory
Ik heb geprobeerd dit uit te voeren op zowel Ubuntu als Fedora, maar dezelfde fout doet zich voor. Kan iemand me alsjeblieft vertellen wat ik hier mis?
Opmerkingen
- Gerelateerd: unix.stackexchange.com/questions/40786/…
Answer
Eerst moet je de spaties voor de opdracht verwijderen, bijv.
sum="expr $num1 + $num2"
dan moet je "
veranderen in een `
of nog beter in $()
:
sum=$(expr "$num1" + "$num2")
in plaats van expr
te gebruiken, kunt u ook de berekening uitvoeren ulatie rechtstreeks in uw shell:
sum=$((num1 + num2))
Reacties
- Als de motivatie voor het gebruik van
expr
in plaats van$((...))
is een wens om draagbaar te zijn naar de klassieke Bourne-shell, dan is het ' een goed idee om$(...)
ook te vermijden. - @AlanCurry zijn er shells die
$()
niet ondersteunen? Voorzover ik weet is dit vereist door posix, b.v. alle posix-compatibele shells zouden$()
- @UlrichDangel moeten ondersteunen De originele Bourne-shell heeft ' t
$(…)
, maar het is bijna uitgestorven (misschien draait iemand ergens nog/bin/sh
op Solaris). - De C-schaal doet het niet t ondersteunt
$(…)
–– of in ieder geval niet alle versies. - Wat is het doel van dubbele aanhalingstekens rond de variabelen?
Answer
Je hebt waarschijnlijk backticks verkeerd gelezen als enkele aanhalingstekens in de regel:
sum = "expr $num1 + $num2"
Zie Greg “s Wiki over het gebruik van $(...)
.
Dit werkt zoals verwacht:
sum=$(expr "$num1" + "$num2")
Merk ook op dat er geen gaten zijn rond het gelijkteken (de variabele toewijzing).
Antwoord
expr
is een extern programma dat wordt gebruikt door Bourne-shell (d.w.z. sh). Bourne shell had oorspronkelijk geen mechanisme om eenvoudige rekenkundige bewerkingen uit te voeren. Het gebruikt een expr
extern programma met behulp van backtick.
De backtick ( `) wordt eigenlijk opdrachtvervanging genoemd. Opdrachtvervanging is het mechanisme waarmee de shell een bepaalde reeks opdrachten uitvoert en vervolgens hun uitvoer in de plaats van de commandos.
sum=`expr $num1 + $num2`
In bash (weer bourne shell) het heeft de volgende systax, het zal “geen extrnal programma gebruiken expr
.
sum=$((num1+num2))
als we het externe programma expr
willen gebruiken. we hebben de volgende systax:
sum=$(expr $num1 + $num2)