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 

ange bildbeskrivning här

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

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) 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *