Jeg lærer Shell-scripting til et eksamensbevis i IT, jeg laver i øjeblikket. Jeg prøver at skrive et lille script, der tilføjer to tal som vist i en af vejledningerne, vi fik.

echo "Enter two numbers" read num1 num2 sum = "expr $num1 + $num2" echo "The sum is = $sum" 

Men når jeg giver det, tilladelse til udførelse og køre scriptet, det giver mig denne fejl.

sum: =. No such file or directory. sum: expr $num1 + $num2: No such file or directory 

indtast billedbeskrivelse her

Jeg forsøgte at køre dette på både Ubuntu og Fedora, men samme fejl opstår. Kan nogen fortælle mig, hvad jeg mangler her?

Kommentarer

Svar

Først skal du slippe af med pladserne til opgaven, f.eks.

sum="expr $num1 + $num2" 

så skal du ændre " til en ` eller endnu bedre til $():

sum=$(expr "$num1" + "$num2") 

i stedet for at bruge expr kan du også lave beregningen ulation direkte i din shell:

sum=$((num1 + num2)) 

Kommentarer

  • Hvis motivationen til at bruge expr i stedet for $((...)) er et ønske om at være bærbar til den klassiske Bourne-skal, så er det ' en god idé for at undgå $(...) også.
  • @AlanCurry er der nogen skaller, der ikke understøtter $()? Så vidt jeg ved, kræves det af posix, f.eks. alle posix-kompatible skaller skal understøtte $()
  • @UlrichDangel Den originale Bourne-skal havde ikke ' t havde $(…), men det er ved at dø ud (måske kører nogen et sted stadig /bin/sh på Solaris).
  • C-shell gør ikke t support $(…) –– eller i det mindste ikke alle versioner.
  • Hvad er formålet med at have dobbelt anførselstegn omkring variablerne?

Svar

Du har sandsynligvis mislæst backticks som enkelt anførselstegn i linjen:

sum = "expr $num1 + $num2"

Se Gregs Wiki om i stedet at bruge $(...).

Dette fungerer som forventet:

sum=$(expr "$num1" + "$num2")

Bemærk også, at der ikke er nogen huller omkring ligetegnet (variabel tildelingen).

Svar

expr er et eksternt program, der bruges af Bourne-skal (dvs. sh). Bourne-skal havde oprindeligt ikke nogen mekanisme til at udføre simpel aritmetik. Den bruger expr eksternt program ved hjælp af backtick.

Backtick ( `) kaldes faktisk kommandosubstitution. Kommandosubstitution er den mekanisme, hvormed skallen udfører et givet sæt kommandoer og derefter erstatter deres output i kommandoenes sted.

sum=`expr $num1 + $num2` 

I bash (bourne igen shell) den har følgende systax, den vil ikke bruge det eksterne program expr.

sum=$((num1+num2)) 

hvis vi vil bruge det eksterne program expr. vi har følgende systaks:

sum=$(expr $num1 + $num2) 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *