Jeg lærer Shell-skripting for et diplom i IT jeg for øyeblikket holder på med. Jeg prøver å skrive et lite skript som legger til to tall som vist i en av veiledningene vi fikk.

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

Men når jeg gir det, kjøringstillatelse og kjør skriptet, det gir meg denne feilen.

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

skriv inn bildebeskrivelse her

Jeg prøvde å kjøre dette på både Ubuntu og Fedora, men samme feil oppstår. Kan noen fortelle meg hva jeg mangler her?

Kommentarer

Svar

Først må du kvitte deg med plassene for oppgaven, f.eks.

sum="expr $num1 + $num2" 

så må du endre " til en ` eller enda bedre til $():

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

i stedet for å bruke expr kan du også gjøre beregningen ulation direkte i skallet ditt:

sum=$((num1 + num2)) 

Kommentarer

  • Hvis motivasjonen for å bruke expr i stedet for $((...)) er et ønske om å være bærbar til klassisk Bourne-skall, så er det ' en god idé for å unngå $(...) også.
  • @AlanCurry er det noen skjell som ikke støtter $()? Så vidt jeg vet kreves det av posix, f.eks. alle posix-kompatible skall skal støtte $()
  • @UlrichDangel Det opprinnelige Bourne-skallet hadde ikke ' t hadde $(…), men den har omtrent dødd ut (kanskje noen kjører fremdeles /bin/sh på Solaris).
  • C-skallet gjør ikke t support $(…) –– eller i det minste ikke alle versjoner.
  • Hva er hensikten med å ha dobbelt anførselstegn rundt variablene?

Svar

Du har sannsynligvis feilleset backticks som enkelt anførselstegn i linjen:

sum = "expr $num1 + $num2"

Se Gregs Wiki om hvordan du bruker $(...) i stedet.

Dette fungerer som forventet:

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

Vær også oppmerksom på at det ikke er noen hull rundt likhetstegnet (variabel tildeling).

Svar

expr er et eksternt program som brukes av Bourne-skall (dvs. sh). Bourne-skallet hadde ikke opprinnelig noen mekanisme for å utføre enkel regning. Den bruker expr eksternt program ved hjelp av backtick.

Backtick ( `) kalles faktisk kommandosubstitusjon. Kommandosubstitusjon er mekanismen som skallet utfører et gitt sett med kommandoer og erstatter deretter utdataene i kommandoenes plass.

sum=`expr $num1 + $num2` 

I bash (bourne again shell) den har følgende systaks, den vil ikke bruke eksternt program expr.

sum=$((num1+num2)) 

hvis vi vil bruke det eksterne programmet expr. vi har følgende systaks:

sum=$(expr $num1 + $num2) 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *