Jag lär mig Shell-skript för ett examensbevis i IT som jag för närvarande håller på att göra. Jag försöker skriva ett litet skript som lägger till två siffror som visas i en av handledningarna vi fick.
echo "Enter two numbers" read num1 num2 sum = "expr $num1 + $num2" echo "The sum is = $sum"
Men när jag ger det körningstillstånd och kör skriptet, det ger mig det här felet.
sum: =. No such file or directory. sum: expr $num1 + $num2: No such file or directory
Jag försökte köra detta på både Ubuntu och Fedora men samma fel uppstår. Kan någon snälla berätta för mig vad jag saknar här?
Kommentarer
- Relaterat: unix.stackexchange.com/questions/40786/…
Svar
Först måste du bli av med utrymmena för uppgiften, t.ex.
sum="expr $num1 + $num2"
då måste du ändra "
till `
eller ännu bättre till $()
:
sum=$(expr "$num1" + "$num2")
istället för att använda expr
kan du också göra beräkningen ulation direkt i ditt skal:
sum=$((num1 + num2))
Kommentarer
- Om motivet för att använda
expr
istället för$((...))
är en önskan att vara bärbar till ett klassiskt Bourne-skal, då är det ' en bra idé för att undvika$(...)
också. - @AlanCurry finns det några skal som inte stöder
$()
? Såvitt jag vet krävs av posix, t.ex. alla posix-kompatibla skal ska stödja$()
- @UlrichDangel Det ursprungliga Bourne-skalet hade inte ' t hade
$(…)
, men det har dött ut (kanske någonstans fortfarande kör/bin/sh
på Solaris). - C-skalet gör inte t support
$(…)
–– eller åtminstone inte alla versioner. - Vad är syftet med dubbla citat runt variablerna?
Svar
Du har förmodligen felaktigt läst backticks som enstaka citat på raden:
sum = "expr $num1 + $num2"
Se Gregs Wiki om istället att använda $(...)
.
Detta fungerar som förväntat:
sum=$(expr "$num1" + "$num2")
Observera att det inte finns några luckor runt likhetstecknet (variabeltilldelningen).
Svar
expr
är ett externt program som används av Bourne-skal (dvs. sh). Bourne-skalet hade ursprungligen ingen mekanism för att utföra enkel aritmetik. Den använder expr
externt program med hjälp av backtick.
Backtick ( `) kallas faktiskt kommandosubstitution. Kommandosubstitution är den mekanism genom vilken skalet utför en viss uppsättning kommandon och sedan ersätter deras utdata i plats för kommandona.
sum=`expr $num1 + $num2`
I bash (bourne igen skal) den har följande systax, den kommer inte att använda extrnalt program expr
.
sum=$((num1+num2))
om vi vill använda det externa programmet expr
. vi har följande systax:
sum=$(expr $num1 + $num2)