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