BASH skripti / if ???

miten testaan ohjelman paluukoodin bash -skriptissä?

Yleensähän ohjelmat palauttavat 0 jos kaikki on ok, ja nollaa suuremman koknaisluvun, jos jotain meni pieleen.

Yritin itse googlettaa asiaa, ja ...

http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html#ss10.4

#!/bin/bash
cd /dada &> /dev/null
echo rv: $?
cd $(pwd) &> /dev/null
echo rv: $?

em. tavalla todellakin tulostuu 0 tai 1 näytölle.

Mutta entä tuon $?:n testaus if -lauseella, miten ???
Seuraava tulostaa vain 2 kertaa "1".


cd /dada &> /dev/null
echo rv: $?
#
if [ "$?" -eq 0 ]; then
echo "1"
else
echo "dada ERR expression evaluated as 0 (false)"
fi
#
cd $(pwd) &> /dev/null
echo rv: $?
#
if [ "$?" -eq 0 ]; then
echo "1"
else
echo "pwd ERR expression evaluated as 0 (false)"
fi

miten siis ?
5392
Äänestä

Muut lukivat myös

Vastaukset 5

Vanhimmat

en nyt todella tiedä mitä haluat saada aikaiseksi, mutta luultavasti tuo toimii vain bashilla, eikä sh:lla.

eli alkuun rivi
#!/bin/bash
tai suoritus
bash skripti eikä
sh skripti

menisikö kokonaisuudessaan:
----
#!/bin/bash
cd /dada &> /dev/null
vertaa=$?
echo rv: $vertaa
if [ "$vertaa" -eq 0 ]; then
echo "1"
else
echo "dada ERR expression evaluated as 0 (false)"
fi
#
#
cd $(pwd) &> /dev/null
vertaab=$?
echo rv: $vertaab
#
if [ "$vertaab" -eq 0 ]; then
echo "1"
else
echo "pwd ERR expression evaluated as 0 (false)"
fi
---

haluatko kertoa mitä olet tekemässä :)

Äänestä

> Seuraava tulostaa vain 2 kertaa "1" <

if [ "$?" -eq 0 ]; then
echo "1"
else
echo "dada ERR expression evaluated as 0 (false)"
fi

Noissa if-else testeissäsi pitäis nuo echot olla tasan päinvastaisessa järjestyksessä?

if [ "$?" -eq 0 ]; then
echo "OK: ed. komennon paluuarvo on $?"
else
echo "VIRHE: ed. komennon paluuarvo on $?"
fi

Äänestä
  • > miten testaan ohjelman paluukoodin bash -skriptissä? <

    #!/bin/sh

    # Edeltävän komennon paluuarvon testaus skriptissä muuttujan $? avulla

    # Ekan komennon tulisi palauttaa arvon 0,
    # olettaen, että käyttäjän kotihakemisto ~ on olemassa:
    # (tuo ~ on vaan lyhenne /home/käyttäjätunnus)
    cd ~ 2&>1 /dev/null
    if [ "$?" -eq 0 ]; then
    echo "OK: Eka komento palautti arvon $?"
    else
    echo "VIRHE: Eka komento palautti arvon $?"
    fi

    # Tokan komennon ei tulisi palauttaa arvoa 0,
    # olettaen, että hakemistoa /foobar ei ole olemassa:
    cd /foobar 2&>1 /dev/null
    if [ "$?" -eq 0 ]; then
    echo "OK: Toka komento palautti arvon $?"
    else
    echo "VIRHE: Toka komento palautti arvon $?"
    fi

    Äänestä

  • :wq kirjoitti:

    > miten testaan ohjelman paluukoodin bash -skriptissä? <

    #!/bin/sh

    # Edeltävän komennon paluuarvon testaus skriptissä muuttujan $? avulla

    # Ekan komennon tulisi palauttaa arvon 0,
    # olettaen, että käyttäjän kotihakemisto ~ on olemassa:
    # (tuo ~ on vaan lyhenne /home/käyttäjätunnus)
    cd ~ 2&>1 /dev/null
    if [ "$?" -eq 0 ]; then
    echo "OK: Eka komento palautti arvon $?"
    else
    echo "VIRHE: Eka komento palautti arvon $?"
    fi

    # Tokan komennon ei tulisi palauttaa arvoa 0,
    # olettaen, että hakemistoa /foobar ei ole olemassa:
    cd /foobar 2&>1 /dev/null
    if [ "$?" -eq 0 ]; then
    echo "OK: Toka komento palautti arvon $?"
    else
    echo "VIRHE: Toka komento palautti arvon $?"
    fi

    Ainoa ongelma alkuperäisessä koodissani oli se, että:

    cd /dada &> /dev/null
    echo rv: $?
    #
    if [ "$?" -eq 0 ]; then

    ...

    ... siis tuo echo vielä tulostaa oikean arvon, mutta samalla echo on itsekin komento (joka onnistuu aina?),

    joten tuon echo:n suorituksen jälkeen ehtolause

    if [ "$?" -eq 0 ]; then

    on aina tosi, sillä komennon echo suoritus asettaa $?:n nollaksi, joten aina 0=0 -> aina tosi.

    Eli tässä tapauksessa ongelman voi välttää vaikkapa näin:

    V1="$?"
    echo rv: $V1
    if [ "$V1" -eq 0 ]; then

    tuo kopioi $?:n muuttujaan V1, jolloin echo kyllä nollaa $?;n mutta ei siitä tehtyä kopiota V1.

    Noissa muissa vastauksissahan ei erikseen echota tuota arvoa ennen if -testiä joten ongelmaa ei niissä ilmene.

    nyt kun vielä selviäisi, miten päin AND ja OR -operaatio kohtelee noita arvoja.

    yleensähän muissa ohjelmointikielissä false=0, ja
    true sitten kielestä riippuen:

    a) 1
    b) -1
    c) mitä tahansa paitsi ei 0

    Mutta bashissa ilmeisesti 0=true ?

    jos näin niin toimivatko AND ja OR -operaatiot numeeristen arvojen vai totuusarvojen mukaan ?

    Äänestä

  • skriptaaja kirjoitti:

    Ainoa ongelma alkuperäisessä koodissani oli se, että:

    cd /dada &> /dev/null
    echo rv: $?
    #
    if [ "$?" -eq 0 ]; then

    ...

    ... siis tuo echo vielä tulostaa oikean arvon, mutta samalla echo on itsekin komento (joka onnistuu aina?),

    joten tuon echo:n suorituksen jälkeen ehtolause

    if [ "$?" -eq 0 ]; then

    on aina tosi, sillä komennon echo suoritus asettaa $?:n nollaksi, joten aina 0=0 -> aina tosi.

    Eli tässä tapauksessa ongelman voi välttää vaikkapa näin:

    V1="$?"
    echo rv: $V1
    if [ "$V1" -eq 0 ]; then

    tuo kopioi $?:n muuttujaan V1, jolloin echo kyllä nollaa $?;n mutta ei siitä tehtyä kopiota V1.

    Noissa muissa vastauksissahan ei erikseen echota tuota arvoa ennen if -testiä joten ongelmaa ei niissä ilmene.

    nyt kun vielä selviäisi, miten päin AND ja OR -operaatio kohtelee noita arvoja.

    yleensähän muissa ohjelmointikielissä false=0, ja
    true sitten kielestä riippuen:

    a) 1
    b) -1
    c) mitä tahansa paitsi ei 0

    Mutta bashissa ilmeisesti 0=true ?

    jos näin niin toimivatko AND ja OR -operaatiot numeeristen arvojen vai totuusarvojen mukaan ?

    > Mutta bashissa ilmeisesti 0=true ?
    jos näin niin toimivatko AND ja OR -operaatiot numeeristen arvojen vai totuusarvojen mukaan ? <

    Tuohon en osaa sanoa mitään, että mitä arvoja loogiset operaatiot bashissä sisäisesti käyttää. Ainoa mitä löysin on tämä, joka vaan listaa kaikki bash-operaattorit:
    http://tldp.org/LDP/abs/html/ops.html

    Äänestä

Kommentoi aloitusta


skriptaaja kirjoitti:

miten testaan ohjelman paluukoodin bash -skriptissä?

Yleensähän ohjelmat palauttavat 0 jos kaikki on ok, ja nollaa suuremman koknaisluvun, jos jotain meni pieleen.

Yritin itse googlettaa asiaa, ja ...

http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html#ss10.4

#!/bin/bash
cd /dada &> /dev/null
echo rv: $?
cd $(pwd) &> /dev/null
echo rv: $?

em. tavalla todellakin tulostuu 0 tai 1 näytölle.

Mutta entä tuon $?:n testaus if -lauseella, miten ???
Seuraava tulostaa vain 2 kertaa "1".


cd /dada &> /dev/null
echo rv: $?
#
if [ "$?" -eq 0 ]; then
echo "1"
else
echo "dada ERR expression evaluated as 0 (false)"
fi
#
cd $(pwd) &> /dev/null
echo rv: $?
#
if [ "$?" -eq 0 ]; then
echo "1"
else
echo "pwd ERR expression evaluated as 0 (false)"
fi

miten siis ?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu