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
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
- Relateret: unix.stackexchange.com/questions/40786/…
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)