Bash eval-komento

`eval`-komentoa käytetään bashissa argumenttien suorittamiseen komentotulkin komennon tavoin. Argumentit yhdistetään merkkijonoksi ja otetaan syötteenä shell-komennolle komennon suorittamiseksi. `eval` suorittaa komennon nykyisessä komentotulkissa. Tämä komento on käyttökelpoinen, kun halutaan suorittaa jokin komento, joka sisältää erityisen operaattorin tai varattuja avainsanoja. Tätä komentoa voidaan käyttää missä tahansa komentosarjassa myös silloin, kun muuttujan nimi on tuntematon ennen komentosarjan suorittamista. Tämä opetusohjelma auttaa Linux-käyttäjiä oppimaan tämän komennon käytön.

Syntaksi:

eval

Tässä argumentit jäsennetään ja yhdistetään merkkijonoksi, jonka komentotulkki suorittaa. `eval` palauttaa poistumistilakoodin komennon suorittamisen jälkeen. `eval` palauttaa poistumistilakoodiksi 0, jos argumenttia ei ole annettu tai on annettu vain nolla-argumentti.

Esimerkki-1: Komennon `wc` suorittaminen komennolla `eval`

Esitetään, että tekstitiedosto nimeltä ”osasto.txt” sisältää seuraavan tekstin. Tiedoston rivien kokonaismäärä voidaan laskea `wc`-komennolla.

osasto.txt

CSE
EEE
ETE
ENGLISH
BBA
PHARMATIIKKA

Seuraavalla komennolla tallennetaan muuttujaan $mycommand muuttujaan $mycommand komento, jolla voidaan laskea tiedoston osasto.txt rivien kokonaismäärä.

$ mycommand=”wc -l osasto.txt”

Seuraavalla `eval`-komennolla suoritetaan `wc`-komento ja tulostetaan rivien kokonaismäärä.

$ eval $mycommand

Tulos:

Tuloste osoittaa, että osasto.txt-tiedostossa on 6 riviä.

Examplel-2: Komennon `expr` suorittaminen komennolla `eval`

Luo bash-tiedosto nimeltä evaltest.sh ja lisää seuraava skripti. Tämä skripti määrittää kaksi kokonaislukuarvoa muuttujiin $x ja $y. Komennot `expr` ja `echo` osoitetaan kahteen muuttujaan $c1 ja $c2, jotka suoritetaan myöhemmin komennolla `eval`.

evaltest.sh

#!/bin/bash
#Initialisoidaan muuttujat x ja y
x=5
y=15
#Ensimmäistä komentomuuttujaa käytetään `expr`-komennon antamiseen $x:n ja $y:n arvojen laskemiseksi yhteen
c1=”`expr $x + $y`”
#Toisen komentokäskyllä muuttujaa käytetään osoittamaan `echo`-komento
c2=”echo”
#`eval` laskee ja tulostaa $x:n ja $y:n summan suorittamalla muuttujien $c1
ja $c2 komennot
eval $c2 $c1
val $c2 $c1

Skripti ajetaan.

$ bash evaltest.sh

5:n ja 15:n summa on 20, joka näkyy tulosteessa.

Esimerkki-3: Tulosta sellaisen muuttujan arvo, joka on määritetty toiselle muuttujalle

Luo bash-skripti nimeltä evaltest2.sh seuraavalla komentosarjalla. Tässä yhtä muuttujaa käytetään osoittamaan toisen muuttujan nimi, joka sisältää merkkijonotietoja. `eval`-komento tulostaa toisen muuttujan nimen sisältävän muuttujan arvon sisältönä.

evaltest2.sh

#!/bin/bash
# Määritä merkkijonon arvo muuttujaan $str1
str1=”Shell Script”
# Määritä muuttujan nimi ”str1” muuttujaan $str2
str2=str1
#Tallenna komento muuttujaan, $command
command=”echo”
# `eval`-komento suorittaa `echo`-komennon ja tulostaa muuttujan
sisältävän muuttujan
arvon toiseen muuttujaan
eval $command \${$str2}

Skriptin suoritus.

$ bash evaltest2.sh

Muuttujan $str1 arvo tulostuu.

Muuttujan, jonka nimenä on toisen muuttujan arvo, arvoon pääsee käsiksi toisellakin tavalla. Käyttämällä symbolia ’!’ voidaan päästä käsiksi tämäntyyppisen muuttujan arvoon. Seuraavaa komentoa voidaan käyttää edellisen skriptin vaihtoehtona, ja tuloste on sama.

$ str1=”Shell-skripti”; str2=str1; command=”echo”; eval $command ${!str2}

Esimerkki-4: Luodaan sarja muuttujia, joilla on arvot, ja lasketaan arvojen summa `eval`-komennolla

Luo bash-skripti nimeltä evaltest3.sh ja lisää siihen seuraava skripti. Tämä skripti luo sarjan muuttujia ja tallentaa arvot muuttujiin `eval`-komennolla. Muuttujien arvot lasketaan yhteen ja tallennetaan muuttujaan nimeltä $sum. Seuraavaksi `echo`-komento merkkijonoarvoineen osoitetaan muuttujaan, jota käytetään `eval`-komennossa $sum-muuttujan arvon tulostamiseen.

evaltest3.sh

#!/bin/bash
# Alustetaan muuttuja $sum arvolla 0
sum=0
# Julistetaan for-silmukka, joka iteroi 4 kertaa
for n in {1…4}
do
# Luo neljä muuttujaa eval-komennolla
eval x$n=$n
# Lisää muuttujan arvot $sum
sum=$(($sum+$x$n))
done
# Määritä `echo`-komento. merkkijonon kanssa muuttujaan
command=”echo ’Summan tulos='”
# `eval`-komento tulostaa summan arvon muuttujien avulla
eval $command $sum

Skriptin suoritus.

$ bash evaltest3.sh

Neljän muuttujan summa on, 1+2+3+4=10, joka tulostetaan.

Esimerkki-5: `eval`-komennon käyttäminen tiedostoluettelon poistamiseen

Luo bash-tiedosto nimeltä evaltest4.sh, jossa on seuraava skripti. Tämä skripti lukee kolme komentorivin argumenttia poistettavina tiedostoniminä ja tallentaa argumenttien arvot array-muuttujaan $fn. Komento `rm’ tallennetaan muuttujaan $command. Tässä ilmoitetaan for-silmukka, joka hakee jokaisen tiedostonimen ja poistaa tiedoston `eval`-komennolla, jos tiedosto on olemassa.

evaltest4.sh

#!/bin/bash
#Julkista joukko
declare -A fn
# Lue kolme komentoriviargumenttia ja tallenna kolmeen array-indeksiin
fn=$1
fn=$2
fn=$3
# Tallenna poistokomento muuttujaan
command=”rm”
# for-silmukka iteroi kolmeen kertaan lukeakseen kolme array-alkioelementtiä
for index in 0 1 2
do
# Tarkista, että tiedosto on olemassa tai että sitä ei ole olemassa
if } ]]; then
# Jos tiedosto on olemassa, poista tiedosto
eval $command ${fn}
# Ilmoita käyttäjälle, että tiedosto on poistettu
echo ”${fn} on poistettu.”
Else
# Ilmoita käyttäjälle, että tiedostoa ei ole olemassa
echo ”${fn} ei ole.”
fi
done

Skriptin suoritus.

$ bash evaltest4.sh marks.docx item.txt product.docx

Tässä skriptin suoritushetkellä annetaan kolmen tiedoston nimet. Tuloste osoittaa, että marks.docx ja product.docx ovat olemassa nykyisessä sijainnissa ja tiedostot poistetaan ja, item.txt ei ole olemassa nykyisessä sijainnissa.

Johtopäätökset

Mitä tahansa bash-komentoa voidaan suorittaa komennolla `eval` ilmoittamalla se merkkijonoksi. `eval`-komentoa käytetään tässä opetusohjelmassa bashin erilaisten sisäänrakennettujen komentojen suorittamiseen ja sarjan muuttujien luomiseen. Käyttäjille selvitetään `eval`-komennon käyttötavat ja he pystyvät käyttämään tätä komentoa eri tarkoituksiin luettuaan tämän opetusohjelman.

Vastaa

Sähköpostiosoitettasi ei julkaista.