használatával Shell szkripteket tanulok az informatikai diplomához. Olyan kis szkriptet próbálok írni, amely két számot ad hozzá, amint az az egyik bemutatónk látható.
echo "Enter two numbers" read num1 num2 sum = "expr $num1 + $num2" echo "The sum is = $sum"
Amikor azonban megadom, végrehajtási engedélyt és futtassa a szkriptet, ez adja nekem ezt a hibát.
sum: =. No such file or directory. sum: expr $num1 + $num2: No such file or directory
Megpróbáltam futtatni ezt mind az Ubuntu, mind a Fedora rendszeren, de ugyanaz a hiba fordul elő. Tudna valaki mondani valamit, ami itt hiányzik nekem? >
Válasz
Először meg kell szabadulnia a feladat szóközeitől, pl.
sum="expr $num1 + $num2"
akkor a "
-et `
-re vagy még jobb :
sum=$(expr "$num1" + "$num2")
a expr
helyett a számítást is elvégezheti közvetlenül a héjában:
sum=$((num1 + num2))
Megjegyzések
, de kb. Kihalt (lehet, hogy valahol valaki még mindig fut /bin/sh
a Solaris-on).
$(…)
–– vagy legalábbis nem az összes verziót. Válasz
Valószínűleg rosszul olvasta a backtickeket egyetlen idézőjelként a sorban:
sum = "expr $num1 + $num2"
Lásd Greg “Wikijét az $(...)
használatával.
Ez a várakozásoknak megfelelően működik:
sum=$(expr "$num1" + "$num2")
Vegye figyelembe azt is, hogy az egyenlőségjel (a változó hozzárendelés) körül nincsenek hézagok.
Válasz
expr
egy külső program, amelyet a Bourne shell (azaz SH). A Bourne shell-nek eredetileg nem volt mechanizmusa az egyszerű számtan elvégzésére. expr
külső programot használ a backtick segítségével.
A backtick ( `) valójában parancshelyettesítésnek nevezzük. A parancshelyettesítés az a mechanizmus, amellyel a shell végrehajtja az adott parancskészletet, majd a kimenetüket helyettesíti a a parancsok helye.
sum=`expr $num1 + $num2`
In bash (bourne again shell) a következő szisztax van, nem fogja használni az extrnal programot expr
.
sum=$((num1+num2))
ha a expr
külső programot akarjuk használni. a következő szisztax van:
sum=$(expr $num1 + $num2)
expr
a$((...))
helyett az a vágy, hogy hordozható legyen a klasszikus Bourne-héjhoz, majd ' jó ötlet hogy elkerülje a$(...)
-t is.$()
-et? Ha jól tudom, a posix előírja, pl. az összes posix kompatibilis héjnak támogatnia kell a$()