Opiskelen parhaillaan IT-tutkintotodistuksen Shell-komentosarjoja. Yritän kirjoittaa pienen komentosarjan, joka lisää kaksi numeroa kuten meille annetuissa opetusohjelmissa on esitetty.
echo "Enter two numbers" read num1 num2 sum = "expr $num1 + $num2" echo "The sum is = $sum"
Kuitenkin, kun annan sille Suorita käyttöoikeus ja suorita komentosarja, se antaa minulle tämän virheen.
sum: =. No such file or directory. sum: expr $num1 + $num2: No such file or directory
Yritin suorittaa tämän sekä Ubuntussa että Fedorassa, mutta sama virhe tapahtuu. Voisiko joku kertoa minulle, mitä minulta puuttuu?
Kommentit
- Liittyvät: unix.stackexchange.com/questions/40786/…
Vastaa
Ensin täytyy päästä eroon tehtävän välilyönneistä, esim.
sum="expr $num1 + $num2"
sitten sinun on vaihdettava "
arvoksi `
tai vielä parempi – $()
:
sum=$(expr "$num1" + "$num2")
expr
-kohdan käyttämisen sijaan voit myös suorittaa laskutoimituksen ulaatio suoraan kuoressa:
sum=$((num1 + num2))
Kommentit
- Jos motivaatio
expr
$((...))
sijaan on halu olla siirrettävissä klassiseen Bourne-kuoreen, sitten se ' on hyvä idea välttää myös$(...)
. - @AlanCurry Onko kuoria, jotka eivät tue
$()
? Sikäli kuin tiedän, sitä vaatii posix, esim. kaikkien posix-yhteensopivien kuorien tulisi tukea$()
- @UlrichDangel Alkuperäisessä Bournen kuoressa ei ollut ' t
$(…)
, mutta se on melkein kuollut (ehkä joku jonnekin on edelleen käynnissä/bin/sh
Solariksessa). - C-kuori ei t eivät tue
$(…)
–– tai ainakaan kaikkia versioita. - Mikä on tarkoitus, että muuttujien ympärillä on lainausmerkit?
Vastaa
Olet todennäköisesti lukenut väärin vain yhden lainausmerkin rivillä:
sum = "expr $num1 + $num2"
Katso Gregin Wiki , kun käytät sen sijaan $(...)
.
Tämä toimii odotetulla tavalla:
sum=$(expr "$num1" + "$num2")
Huomaa myös, että yhtälömerkin (muuttujamäärityksen) ympärillä ei ole aukkoja.
Vastaus
expr
on ulkoinen ohjelma, jota Bourne-kuori (eli sh). Bourne-kuorella ei ollut alun perin mitään mekanismia yksinkertaisen laskutoimituksen suorittamiseksi. Se käyttää ulkoista ohjelmaa expr
backtickin avulla.
Taaksepäin ( `) kutsutaan itse asiassa komennon korvaukseksi. Komennon korvaaminen on mekanismi, jolla kuori suorittaa tietyn komentojoukon ja korvaa sitten niiden tuotoksen komentojen paikka.
sum=`expr $num1 + $num2`
Kohdassa bash (bourne again shell) sillä on seuraava systax, se ei käytä ulkopuolista ohjelmaa expr
.
sum=$((num1+num2))
jos haluamme käyttää ulkoista ohjelmaa expr
. meillä on seuraava systax:
sum=$(expr $num1 + $num2)